我是Java新手(1个月)。我一直试图做下面的失败,任何帮助将不胜感激。我想要的是:
主要将int数组传递给方法 perm2
perm2(new int[]{1,2,3});
perm2 将对其进行排列并添加到ArrayList并返回它。
这是我到目前为止所拥有的。正如你所看到的,它只是打印出排列。
问题是我无法将它们添加到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中返回。
答案 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);
}