在静态类中调用非静态方法 - java

时间:2016-03-15 15:31:59

标签: java static permutation non-static

我正在尝试编写一个代码,该代码生成一个List,其中包含给定int数组的所有可能的排列。

我有found online a method(下面的代码中的“nextPermutation”)允许这样做,我试图将其实现为基本代码,但它不起作用。

问题在于,当我尝试将包含新排列的数组动态添加到列表中时,已存储在列表中的所有先前排列都将替换为新排列。

我想这个问题在某种程度上与我的“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 个答案:

答案 0 :(得分: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"?