2016-09-22 24 views
0

私は私のJavaクラスに繰り返し構造を持っており、次のようにデータを提示したかった:印刷繰り返しループ

Peter Black 
John Red 

構造が右であれば私がままにした場合ので、私は、知りませんあなたのカラーループはINSであることを

Peter-Red 
John-Red 
+0

のような列挙型を使用することができます。伝統的なインデックスベースのループを使用すると、各配列から同じ名前と色を得るのを助ける必要がありますか?どんなパターンがありますか?またはそれは1対1のマッピングですか? –

+0

@DeendayalGargは1:1 – AmandaRJ

+0

@AmandaRJ申し訳ありませんが、私は理解できませんが、なぜ単に人物リストに追加するのではなく、2つの文字列配列を使用していますか? – MCMastery

答えて

1

あなたが達成しようとしていない、ネストされたforループを使用する代わりに、両方のアレイを同時にループします。両方の配列のサイズが異なるので、i < names.length && i < colors.lengthは必ずiは、二つの配列の長さのいずれかを超えることはありませんようになります場合、私はちょうどi < names.lengthを行う、しかし壊れる可能性があり

if (names.length != colors.length) { 
    // error! not a 1:1 relationship 
    return; 
} 
for (int i = 0; i < names.length && i < colors.length; i++) { 
    String name = names[i], color = colors[i]; 
    Person d = new Person(); 
    d.setName(name); 
    d.setColor(color); 
    persons.add(d); 
} 

編集: ここで本当の問題はあなたの情報をどのように格納しているかと思います。 Personオブジェクトを含むコレクションではなく、2つの文字列配列を使用しているのはなぜですか?

+0

Show!Fantastic !!! – AmandaRJ

0

お知らせ:色のみを表示し、データが

public class Test { 

    public static void main(String[] args) { 
     List<Person> persons = new ArrayList<>(); 

     String[] names= {"Peter", "John"}; 
     String[] colors= {"Black", "Red"}; 

     for (String name: names) { 
      Person d = new Person(); 

      d.setName(name); 

      for (String color: colors) { 
       d.setColor(color); 
      } 
      persons.add(d); 
     } 

     for (Person a : persons) { 
      System.out.println(a.getName() + "-" + a.getColor()); 
     } 
    } 
} 

コンソール上書きされますあなたの名前ループIDE。だから、あなたはそれを設定しているそれぞれの名前の最初の色と2番目の色にして、次の名前に移動しています。

あなたの最大の問題は、おそらく高度なforループを使用していることにあります。インデックスにはなりません。あなたが起動した場合:

for(int i=0;i<names.length;i++) 

ソリューションは、おそらく明らかで(とあなたのコードを簡素化)します

(私はより多くを与えるだろうが、それはあなたがそう、私はみますと学ぶことをしようとしている何かのように見えますあなたのコメントを再

)スポイラーを避けるために - あなたは単にあなたが、部分的なオブジェクトを作成Math.maxを使用して対処したい場合

for(int i=0;i<Math.min(names.length, colors.length);i++) 

を使用し、唯一の完全に満たされたオブジェクトを作成する場合いずれかの配列の長さがiより小さい場合のケース。すべてのビジネスロジックコード...あなたが何をしたいのかを定義し、それを行う。その後、あなたは上記の「Math.max」ソリューションを使用した場合のアレイは、等しくないケースを扱うようにしたい場合は

、追加:どのように不正なデータを処理するために、(元の問題の一部ではありません)

ループの内側は次のようになります。

if(names.length < i) 
    d.setName(names[i]) 
if(colors.length < i) 
    d.setColor(colors[i]) 

このように例外はなく、値を安全に設定しています。

しかし、オブジェクトを無効にすると、異なる数の色と名前をユーザーから許可しない方がよい場合があります。彼が3つの名前を入力した場合は、空の色を捨てて、3色になるまで再プロンプトを表示してから、プロンプトを停止します。このような問題をできるだけ早く捕らえるのが常に安全です。

もう一つの良い解決策、で始まる:

if(names.length != colors.length) 
    throw new IllegalArgumentException("createUsers method must have the same number of names as colors but was called with "+names.length+" names and "+colors.length+" colors") 

をお使いのパラメータが正しいの確保と、彼らはあなたのコードLOTを簡素化し、一般的に非常に良い方法ですされていない場合は例外をスローします。

+0

上記のラファエルの答えと同じ問題 – MCMastery

+0

コーディング方法によっては、同じサイズでなければなりません。異なるサイズの配列を扱う必要がある場合は、その場合に何をしたいのかを定義し、例外コードを記述する必要があります。 (2番目の配列が短い場合は、テストを中止しますか、またはPersonは無効な色を取得しますか?色が長ければコードが破棄されますか、最後の値を破棄しますか? –

+0

はい、私は理解していますが、ユーザーがこの情報を与えた場合はどうなりますか? – MCMastery

1

名前ループ内の色配列のループを停止します。

public class Test { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     List<Person> persons = new ArrayList<>(); 

     String[] names= {"Peter", "John"}; 
     String[] colors= {"Black", "Red"}; 

     for (int i=0; i<names.length; i++) { 
      Person d = new Person(); 
      d.setName(names[i]); 
      d.setColor(colors[i]); 
      persons.add(d); 
     } 

     for (Person a : persons) { 
      System.out.println(a.getName() + "-" + a.getColor()); 
     } 
    } 
} 
+0

これは中断し、ArrayIndexOutOfをスローします2つの配列のサイズが異なる場合はBoundsExceptionが発生します – MCMastery

+0

これは当てはまります。しかし、彼らはそうではありません。それらの初心者は、同じインデックスを共有する異なる配列で分けられた人物の特徴を考慮するチャレンジを実践するように見えます。 –

0

あなたはどのように色に名前をマッピングしている

enum Entity { 
     Peter("Black"), 
     John("Red"); 

     private final String color; 

     Entity(String color) { 
      this.color = color; 
     } 
+0

enumを使用する場合は、Personをインタフェースに変更し、enum implement Personを作成します。 – MCMastery

+0

ええ、それはより良い設計になります。 –

+0

@Ankushsoni私はできません。このテストは私のデータベースにデータを含めることでした。私にはフォームがあり、そのデータはそこから得られます。私はフォームの文字列のリストを取得します。 – AmandaRJ

関連する問題