2013-10-15 73 views
0

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

  1. 主要通过int数组到方法PERM2
    perm2(new int[]{1,2,3});

  2. 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中返回。

回答

1

使用的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[] sint... s。然后你可以简单地调用它perm2(1, 2, 3)而不是perm2(new int[] { 1, 2, 3 }),尽管它仍然会接受显式数组。

+0

@blalasaadri'列表'很好。 'int []'是一个对象,而不是一个原始类型。 – Boann

1

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

+0

看到类似的问题[为什么Java集合不能直接存储基元类型?(http://stackoverflow.com/questions/2504959/why-can-java-collections-not-directly-store-primitives -types) –

+1

但我认为int []是一个对象。 (容器对象)否? – dono

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; 
} 
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); 
}