2016-10-30 12 views
0

このプログラムは、ソースリストをペアでシャッフルします。元のリストのようになぜ何度も配列を作成する必要がありますか?

「1」「2」「3」「4」「5」「6」「7」「8」「9」「10」 "11"、 "12"、 "13"、 "14"、 "15"、 "16"、 "17"、 "18"、 "19"、 "20"

trasfoms

11^12 19^20 17^18 15^16 1^2 5^6 3^4~13^14 7^8 9^10

以上が真つつある行はコメントを外しているコメント。今、行Aがコメントされている場合、shuffleListのすべての要素は19^20です。

public class ShuffleService { 

public static void shuffleList(List<String> list) { 

    System.out.println(list); 

    ArrayList<String[]> shuffleList = new ArrayList<String[]>(10); 
    String[] arr = new String[2]; 
    boolean flag = false; 
    int step = 0; 

    for(String s: list){ 

     if(flag){ 
      arr[1]=s; 
     } else { 
      arr[0]=s; 
     } 

     flag=!flag; 
     step++; 

     if(step==2){ 
      shuffleList.add(arr); 
      step=0; 
      //arr = new String[2]; //**line A** 
     } 
    } 

    Collections.shuffle(shuffleList); 

    for(String[] val: shuffleList){ 
     System.out.print(val[0]); 
     System.out.print("^"); 
     System.out.println(val[1]); 
    } 


} 

public static void main(String[] args) { 
     String[] a = new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"}; 
     List<String> list1 = Arrays.asList(a); 
     shuffleList(list1); 
    } 
} 

は、なぜ私が正しく動作するプログラムでA行のコメントを解除する必要がありますか?

+3

それ以外の場合は、参照によって1つのオブジェクト(単数配列)の値を変更するためです。 –

答えて

2

値をarrに書き直すと(再作成せずに)、リストに既に入っている値も変更されることになります。

オブジェクトをリストに追加しても、変更が中止されるわけではありません。それだけではコピーは作成されません。ループ内でnew String[2]を呼び出すことで、リストに追加する各ペアの新しい文字列配列を効果的に構築できます。これは必要なものです。

関連する問題