2016-02-27 3 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') в список. Позднее изменения в этом массиве затем отражаются во всех ссылках. Добавьте копию 'a' в список каждый раз:' list.add (Arrays.copyOf (a, a.length)) ' – schwobaseggl

+0

@schwobaseggl, поэтому, когда я изменяю массив a, он также меняет массив в arraylist? Как добавить только копию? – prone666

+0

См. Мой обновленный комментарий: в принципе, вам нужно создать новый массив для каждой перестановки (что делает метод Arrays.copyOf). Обычно я сначала делал копию, а затем делал изменения, чтобы оставить ваш начальный массив невредимым. – schwobaseggl

ответ

1

Вы используют один и тот же массив снова и снова. Вы переставляете предметы внутри него.

Это нормально, когда вы печатаете его. Но когда вы приходите, чтобы сохранить его в списке, то, что сохраняется, является массив с ссылкой, а не содержимое массива.

Итак, вы вводите ссылку на тот же объект n! раз в список. В конце операции все эти ссылки по-прежнему относятся к одному и тому же объекту - и печать списка будет печатать тот же массив снова и снова с самым последним содержимым, которое у него есть.

Если вы хотите сохранить различное содержимое каждый раз, вам нужно будет скопировать экземпляр из массива и сохранить эту копию.

Так, например, вы можете использовать

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

Спасибо, я использую a.clone(), и это сработало. Так глупая ошибка, ха-ха: D – prone666