2016-02-27 46 views
0

我有一个算法来计算每个int数组的排列。在这种情况下 - 当我想打印这些排列时 - 一切正常。但是,如果我想将阵列保存到arraylist,它会保存它们的正确数量,但它只保存一个相同的选项。我知道这个问题微不足道,但我解决不了。谢谢你的帮助。int []数组添加到列表的排列

我加入方法printArray,之后它将打印的数组保存到Arraylist。的printArray 输出是正确的,但printList输出是这样的:

1 2 3 4 5 6 

and this input is printed n!, which is correct but its only one permutation

这里是我的代码:

公共类置换{

ArrayList<int[]> list; 

public Permute() { 
    list=new ArrayList<>(); 
} 

void printArray(int[] a) { 
    for (int i = 0; i < a.length; i++) { 
     System.out.print(a[i] + " "); 
    } 
    System.out.println(""); 

    list.add(a); 
} 

void printList(){ 
    for(int[] arr:list){ 
     for(int item:arr){ 
      System.out.print(item+" "); 
     } 
     System.out.println(""); 
    } 
} 



void permute(int[] a, int k) { 
    if (k == a.length) 
     printArray(a); 
    else { 
     for (int i = k; i < a.length; i++) { 
      int temp = a[k]; 
      a[k] = a[i]; 
      a[i] = temp; 
      permute(a, k + 1); 
      temp = a[k]; 
      a[k] = a[i]; 
      a[i] = temp; 
     } 
    } 
} 
public static void main(String[] args) { 
    Permute p = new Permute(); 
    int a[] = {1, 2, 3, 4, 5, 6}; 
    p.permute(a, 0); 
    p.printList(); 
} 

}

+1

你总是添加相同的阵列('了')到列表中。稍后对该数组的更改会反映在所有参考中。每次在列表中添加一个'a'的副本:'list.add(Arrays.copyOf(a,a.length))' – schwobaseggl

+0

@schwobaseggl所以当我改变数组a时,它也改变了ArrayList中的数组?我怎样才能添加副本? – prone666

+0

查看我的更新评论:基本上,您必须为每个排列(Arrays.copyOf方法所做的)创建一个新数组。一般来说,我会先复制副本,然后进行更改以保持初始数组不受损害。 – schwobaseggl

回答

1

Yo你一次又一次地使用相同的数组。你重新排列它里面的物品。

打印时很好。但是当你将它保存在一个列表中时,保存的是数组参考,而不是数组内容。

因此,您输入对同一对象n的引用!次列入清单。在操作结束时,所有这些引用仍然引用相同的对象 - 并且打印列表将一次又一次地打印相同的数组,并使用最近的内容。

如果你想每次保存不同的内容,你需要制作一个复制的数组,并保存该副本。

因此,例如,你可以使用

list.add(Arrays.copyOf(a, a.length)); 
+0

谢谢,我使用a.clone(),它的工作。如此愚蠢的错误,哈哈:D – prone666