2016-09-15 4 views
0

私はいくつかの助けが必要です。ここでの実際のケースは、プログラムIコードがいくつかのテキスト文書を読み込み、各テキスト文書の単語数が異なっていることです。私は現在のテキスト文書の数と各テキスト文書の単語数に基づいて動的なサイズを提供するので、これらの単語を2D ArrayListに保持したいと思います。私の2D ArrayList出力は累積値を与えますか?

しかし、いくつかのテストが終了した後、私が期待した通りの出力が得られません。簡単にするために、このサンプルコードを参考にしています。 2D ArrayListの使い方は、実際のケースで使用するのと同じです。

ArrayList<List<String>> twoDWords = new ArrayList<List<String>>(); 
    List<String> oneDword = new ArrayList<String>(); 

    String word = ""; 
    String[] words = new String[5]; 

    System.out.println("Want like these(Using 2D ArrayList):"); 
    for(int i = 0; i< 5; i++) 
    { 
     System.out.print("Array - "+i +": "); 
     word += "myArray "; 
     words[i] = word; 
     System.out.println(word); 
    } 

    System.out.println("\nBut Get these output:"); 
    for(int i = 0; i< 5; i++) 
    { 
     oneDword.add(words[i]); 
     twoDWords.add(oneDword); 
     //oneDword.clear(); 
    } 

    for(int i = 0; i< twoDWords.size(); i++) 
    { 
     System.out.print("Array - "+i +": "); 
     for(int j = 0; j< twoDWords.get(i).size(); j++) 
     { 
      System.out.print(twoDWords.get(i).get(j)+" "); 
     } 
     System.out.println(""); 
    } 

これが出力されます。 enter image description here

それだけ繰り返し、最新の累積値を配るような出力が見えます。コードでわかるように、私はclear()メソッドを使って配列をリセットしようとしますが、空の値を返します。

誰かがこの問題で私を助けてくれることを願っています。ありがとうございます〜

答えて

1

は、読みやすいですので、あなたは、foreachループを使用しなければならない、クリストファー・ソリューションに追加:

for(int i = 0; i< 5; i++) 
{ 
    oneDword.add(words[i]); 
    twoDWords.add(oneDword); 
    oneDword = new ArrayList<String>(); // --> You need this since 'oneDword' contains the previous values as well and it'll keep adding new values to this list. 
    //oneDword.clear(); 
} 

for(List<String> al: twoDWords) { 
    for(String s: al) { 
    System.out.println(s); 
    } 
} 
1

これはあなたの配列twoDwordsのすべての要素に格納されている非常に同じ配列オブジェクトです。あなたは「新しい」ループ内で使用して、配列twoDWordsの各要素のための新しい配列を作成する必要があります。

.......... 
    for(int i = 0; i< 5; i++) 
     { oneDword = new ArrayList<String>(); //<------- 
      oneDword.add(words[i]); 
      twoDWords.add(oneDword); 
      //oneDword.clear(); 
     } 
    ......... 
1

あなたが間違っていることを理解するには、メソッド引数のリファレンスについて考える必要があります。 特別この行:この行で

twoDWords.add(oneDword); 

あなたtwoDWordsリストにoneDwordの「参照」を追加しています。毎回同じoneDwordへの参照を追加しています。したがって、リストサイズは5になりますが、それらはすべてoneDwordリストへの参照を保持します(中間ループで成長し続けます)。