2016-03-15 3 views
0

Я пытаюсь написать код, который генерирует список, содержащий все возможные перестановки заданного массива int.Вызов нестатического метода в статическом классе - java

У меня есть found online a method («nextPermutation» в коде ниже), который позволяет это сделать, и я пытаюсь реализовать его в базовом коде, но он не работает.

Проблема заключается в том, что при попытке динамического добавления массива, содержащего новую перестановку в список, все предыдущие перестановки, уже сохраненные в списке, заменяются новым.

Я предполагаю, что проблема связана с тем, что моя «следующая проверка» нестационарна, но я понятия не имею, что я должен сделать, чтобы ее исправить.

Любое предложение?

package lang_dist; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class lang_dist { 

    public boolean nextPermutation(int[] array) { 
     // Find longest non-increasing suffix 
     int i = array.length - 1; 
     while (i > 0 && array[i - 1] >= array[i]) 
      i--; 
     // Now i is the head index of the suffix 


     // Are we at the last permutation already? 
     if (i <= 0) 
      return false; 

     // Let array[i - 1] be the pivot 
     // Find rightmost element that exceeds the pivot 
     int j = array.length - 1; 
     while (array[j] <= array[i - 1]) 
      j--; 
     // Now the value array[j] will become the new pivot 
     // Assertion: j >= i 

     // Swap the pivot with j 
     int temp = array[i - 1]; 
     array[i - 1] = array[j]; 
     array[j] = temp; 

     // Reverse the suffix 
     j = array.length - 1; 
     while (i < j) { 
      temp = array[i]; 
      array[i] = array[j]; 
      array[j] = temp; 
      i++; 
      j--; 
     } 

     // Successfully computed the next permutation 
     return true; 
    } 

    public static void main(String[] args) 
    { 


    int[] array = {0, 0, 1, 1, 1, 1}; 


    List<int[]> rowList = new ArrayList<int[]>(); 
    List<int[]> results = new ArrayList<int[]>(); 

    lang_dist d=new lang_dist(); 

    while (d.nextPermutation(array)){ 

     System.out.println("Permutation:" + Arrays.toString(array)); 

     results = Arrays.asList(array); 

     rowList.add(results.get(0)); 


    }; 

    System.out.println("---"); 
    for (int[] row : rowList) { 
     System.out.println("Row = " + Arrays.toString(row)); 
    } 
    } 


} 
+1

Есть * статическая * Метода и есть * экземпляр * метода. Создайте экземпляр 'lang_dist' (' new') и вызовите на него свой метод. –

+0

да, вот что я пытался сделать с бит 'lang_dist d = new lang_dist(); \t while (d.nextPermutation (array)) {... 'из кода выше, но это не решает проблему. Или это неправильный способ создания экземпляра? Извините, я очень новичок в java, и я мог бы пропустить что-то очень очевидное. – yamayama

ответ

1

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

Для (быстро) решить эту проблему, необходимо создать новый массив для каждой перестановки:

results = Arrays.asList(array.clone());

Кроме того, results здесь является излишним, используйте rowListилиresults для хранения перестановок.

Я предлагаю вам взглянуть на: Are arrays passed by value or passed by reference in Java? и Is Java "pass-by-reference" or "pass-by-value"?

+0

спасибо, теперь понятно. – yamayama

Смежные вопросы