2017-07-18 9 views
1

に追加します。Javaの比較、二つのリストを反復処理は、その後、私は3つのリストを持っている別のリスト

listA  listB 
1,a,tf  b,true 
2,b,tf  a,false 
3,c,tf  c,true 

及びIは、(listA年代listBtftrue/falseを置き換える)listAの順にlistA + listBことがlistCしたいと思います。

listC 
1,a,false 
2,b,true 
3,c,true 

はここLISTAとListBのための個々のイテレータ間を分割し、インデックス化された状態で自分のコード

Iterator a= listA.iterator(); 
Iterator b= listB.iterator(); 
    while(a.hasNext()){ 
     while(b.hasNext()){ 
      if(String.valueOf(a.next()).split(",")[1].equals(String.valueOf(b.next()).split(",")[0])){ 
        listC.add(String.valueOf(a.next()).replaceAll("tf", String.valueOf(b.next()).split(",")[1])); 
      } 
     } 
    } 

だ、それが正常に動作しますが、私は上記のコードを実行すると、プログラムは単にフリーズします。何かご意見は?

+0

私はそのフリーズについてはよく分からないが、方法が最も可能性の高いあなたが期待する結果を持っていないイテレータを使用。あなたは)(何 'のhasNextに読むべき'と '()次は'行うことを意味しているので、あなたはおそらく実現したいことのhasNext() '(あなたがそうであるように'への呼び出し後に呼び出して '次の()'を複数回if文の中に 'a'と' b'を追加し、さらにbループの 'a'を追加する)は良い考えではありません。 – Thomas

+1

ListBの代わりにMap を使用すると、簡単に作業できます。 '1、a、tf'の独自のクラスを作ることは、文字列を分割するのではなく、条件を簡単に作成するのに役立ちます。あなたはこれらの変更を適用する場合は、あなたのコードは次のようになります( 'YOURCLASS YC:LISTA)について{yc.setTrueFalse(mapB.get(yc.getName()));}'。これはlistAの要素を実際に更新しますが、別のlistCを簡単に作成するソリューションを構築できます。 – Pshemo

答えて

1

あなたは遠く、実際にはありません。反復子は混乱する可能性があるので、私はそれらを避ける傾向があります。

無限ループがあなたのコードにどこにあるのか分かりません。NullPointerExceptionは、a.next()b.next()を何度も呼び出していると思います。

あなたはイテレータを削除するようにコードを変更した場合、それが正常に動作します:

List<String> listA = Arrays.asList("1,a,tf", "2,b,tf", "3,c,tf"); 
List<String> listB = Arrays.asList("b,true", "a,false", "c,true"); 
List<String> listC = new ArrayList<>(); 

for(String a : listA) 
{ 
    for (String b : listB) 
    { 
     if (String.valueOf(a).split(",")[1].equals(String.valueOf(b).split(",")[0])) 
     { 
      listC.add(String.valueOf(a).replaceAll("tf", String.valueOf(b).split(",")[1])); 
     } 
    } 
} 

System.out.println(listC.toString()); 
+0

おっと、私は大学時代のようなコレクションを実際にループしていましたが、今はこれを考えたことはありません。私はいつもイテレータがコレクションに関係すると考えていました。しかし、複数のwhilesでリストを反復することで何が問題になったのか分かりますか? BTW +1あなたの芽、これは数時間私を殺してしまった。やれやれ – Miko

+0

それは* 'a.hasNext()' '一旦a.next()'二回呼び出すとは何か*です。それはあなたがアレイの終わりにあなたを撃つでしょう。私の直感は、無限ループに終わるべきではなく、むしろクラッシュすると言っていますが、明らかに私は間違っています。 FYI、このため、それぞれのスタイル[実際には「フードの下で」イテレータを使用しない](https://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work)ので、そのあなたと違うことはありません(あなたの二重 'a.next()'を除いて)、それはもっと良く見えます。 – Michael

関連する問題