返回整数的Arraylist

时间:2013-10-15 10:26:08

标签: java arraylist

我是Java新手(1个月)。我一直试图做下面的失败,任何帮助将不胜感激。我想要的是:

  1. 主要将int数组传递给方法 perm2 perm2(new int[]{1,2,3});

  2. perm2 将对其进行排列并添加到ArrayList并返回它。

  3. 这是我到目前为止所拥有的。正如你所看到的,它只是打印出排列。
    问题是我无法将它们添加到ArrayList并返回。

    public static void perm2(int[] s) {
        int N = s.length;
        int[] a = new int[N];
        for (int i = 0; i < N; i++) a[i] = s[i];
        perm2(a, N);
    }
    private static void perm2(int[] a, int n) {
        if (n == 1) {
            System.out.println(Arrays.toString(a));
            return;
        }
        for (int i = 0; i < n; i++) {
            swap(a, i, n-1);
            perm2(a, n-1);
            swap(a, i, n-1);
        }
    }  
    private static void swap(int[] a, int i, int j) {
        int c;
        c = a[i]; a[i] = a[j]; a[j] = c;
    }
    

    输出:

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

    我真的不想用sysout输出它们。我只是希望它们在int数组的ArrayList中返回。

4 个答案:

答案 0 :(得分:1)

ArrayList只能保存对象。您可以将int包装类Integer用于int(primitive)值。

答案 1 :(得分:1)

你的第一个perm2方法至少应该返回新对象。原始对象未在该代码中进行修改。

  public static int[] perm2(int[] s) {
    int N = s.length;
    int[] a = new int[N];
    for (int i = 0; i < N; i++) a[i] = s[i];
    perm2(a, N);
    return a;
}
private static void perm2(int[] a, int n) {
    if (n == 1) {
        System.out.println(Arrays.toString(a));
        return;
    }
    for (int i = 0; i < n; i++) {
        swap(a, i, n-1);
        perm2(a, n-1);
        swap(a, i, n-1);
    }
 }  
private static void swap(int[] a, int i, int j) {
    int c;
    c = a[i]; a[i] = a[j]; a[j] = c;
}

答案 2 :(得分:1)

使用主要perm方法的返回类型List<int[]>(或者您更喜欢ArrayList<int[]>):

public static List<int[]> perm2(int[] s) {
    List<int[]> permutations = new ArrayList<>();
    perm2(permutations, s.clone(), s.length);
    return permutations;
}

然后在第二种方法中,将列表作为另一个参数传递给它,以便它可以添加每个排列。请注意,它必须克隆数组,否则它将反复添加相同(更改)的数组对象,最终只会有最终排列的几个副本的列表。

private static void perm2(List<int[]> permutations, int[] a, int n) {
    if (n == 1) {
        permutations.add(a.clone());
        return;
    }
    for (int i = 0; i < n; i++) {
        swap(a, i, n-1);
        perm2(permutations, a, n-1);
        swap(a, i, n-1);
    }
}

要打电话:

List<int[]> permutations = perm2(new int[] { 1, 2, 3 });

for (int[] permutation : permutations) {
    System.out.println(Arrays.toString(permutation));
}

您可能会考虑的一些不必要的事情是将第一个perm2方法的参数从int[] s更改为int... s。然后你可以简单地调用它perm2(1, 2, 3)而不是perm2(new int[] { 1, 2, 3 }),尽管它仍然会接受显式数组。

答案 3 :(得分:0)

您必须更改方法perm2以返回数组和方法的签名。

    public static ArrayList<Integer> perm2(int[] s) {
    ArrayList<Integer> a = new ArrayList<Integer>();
    for (int i = 0; i < a.size(); i++) {
        a.add(s[i]);
    }
    perm2(a, a.size());
    return a;
}
private static void perm2(ArrayList<Integer> a, int n) {
    if (n == 1) {
        return;
    }
    for (int i = 0; i < n; i++) {
        swap(a, i, n - 1);
        perm2(a, n - 1);
        swap(a, i, n - 1);
    }
}
private static void swap(ArrayList<Integer> a, int i, int j) {
    int c;
    c = a.get(i);
    a.add(i, a.get(j));
    a.remove(i + 1);
    a.set(j, c);
}