2017-09-15 44 views
2

我正在使用堆的算法來創建一個包含列表的每個排列的列表列表。每個排列都將是它自己的列表。它在算法中打印時正常工作,但當我嘗試將它添加到列表清單並且它們都是相同的數組(4,1,2,3)時,它無法正常工作。我評論了我測試過的圖片,以確保它能夠正常工作。列表列表中堆的算法實現

我當前的代碼:

public static ArrayList<int[]> lists = new ArrayList<>(); 

public static void main(String[] args) { 
    int[] list = {1,2,3,4}; 
    heapsAlgorithm(4,list); 
    for(int i = 1; i <= lists.size(); i++) { 
     System.out.println("List " + i + ": " + Arrays.toString(lists.get(i-1))); 
    } 
} 

public static void heapsAlgorithm(int n, int[] list) { 
    if (n == 1) { 
     lists.add(list); 
     //System.out.println(Arrays.toString(list)); 
    } 
    else { 
     for(int i = 0; i < n; i++) { 
      heapsAlgorithm(n - 1, list); 
      if (n % 2 == 0) { 
       int swap = list[i]; 
       list[i] = list[n-1]; 
       list[n-1] = swap; 
      } 
      else { 
       int swap = list[0]; 
       list[0] = list[n-1]; 
       list[n-1] = swap; 
      } 
     } 
    } 
} 

工作:

[1, 2, 3, 4] 
[2, 1, 3, 4] 
[3, 1, 2, 4] 
[1, 3, 2, 4] 
[2, 3, 1, 4] 
[3, 2, 1, 4] 
[4, 2, 3, 1] 
[2, 4, 3, 1] 
[3, 4, 2, 1] 
[4, 3, 2, 1] 
[2, 3, 4, 1] 
[3, 2, 4, 1] 
[4, 1, 3, 2] 
[1, 4, 3, 2] 
[3, 4, 1, 2] 
[4, 3, 1, 2] 
[1, 3, 4, 2] 
[3, 1, 4, 2] 
[4, 1, 2, 3] 
[1, 4, 2, 3] 
[2, 4, 1, 3] 
[4, 2, 1, 3] 
[1, 2, 4, 3] 
[2, 1, 4, 3] 

不正確的輸出:

List 1: [4, 1, 2, 3] 
List 2: [4, 1, 2, 3] 
List 3: [4, 1, 2, 3] 
List 4: [4, 1, 2, 3] 
List 5: [4, 1, 2, 3] 
List 6: [4, 1, 2, 3] 
List 7: [4, 1, 2, 3] 
List 8: [4, 1, 2, 3] 
List 9: [4, 1, 2, 3] 
List 10: [4, 1, 2, 3] 
List 11: [4, 1, 2, 3] 
List 12: [4, 1, 2, 3] 
List 13: [4, 1, 2, 3] 
List 14: [4, 1, 2, 3] 
List 15: [4, 1, 2, 3] 
List 16: [4, 1, 2, 3] 
List 17: [4, 1, 2, 3] 
List 18: [4, 1, 2, 3] 
List 19: [4, 1, 2, 3] 
List 20: [4, 1, 2, 3] 
List 21: [4, 1, 2, 3] 
List 22: [4, 1, 2, 3] 
List 23: [4, 1, 2, 3] 
List 24: [4, 1, 2, 3] 

我以爲我用我的ArrayList錯了,但我不知道在哪裏。有什麼建議麼?

+1

您需要將數組副本添加到列表中:'lists.add(Arrays.copyOf(list,list.length))'。 –

+0

謝謝!這工作。爲什麼添加數組副本的原因是什麼,而不是直接添加數組? –

+0

因爲向列表中添加數組(或其他任何內容)不會複製它:您只是存儲引用。因此,對列表「外部」的數組的任何更新也將更新到列表中的「內部」相同的數組。 –

回答

1

你需要複製你的int數組。

你有一個可變的數組實例和數組列表,你假設你保持你的排列。基本上,發生了什麼事:

  1. 你做排列組合。
  2. 您將排列添加到您的ArrayList。
  3. 您在THE SAME對象上做了另一個排列。
  4. 您將對象添加到此列表中的ALREADY。

最後你有ArrayList 20次添加相同的int數組。