我正在尝试创建给定字符串数组的排列。
public static ArrayList<String[]> permutate(String[] str) {
return permutate( str, 0, str.length -1, null );
}
public static ArrayList<String[]> permutate(String[] str, int curr, int stop, ArrayList<String[]> result) {
if(result == null) {
result = new ArrayList<String[]>();
}
if(curr == stop) {
result.add(str);
System.out.println(Arrays.toString(str));
return result;
}
else {
for(int j = curr; j <= stop ; j++) {
//swap str[j] and str[curr]
String tmp = str[j];
str[j] = str[curr];
str[curr] = tmp;
permutate(str, curr+1, stop, result);
//swap str[j] and str[curr]
tmp = str[j];
str[j] = str[curr];
str[curr] = tmp;
}
return result;
}
}
在主要
String[] str = {"A","B","C"};
System.out.println("Inside the recursion:");
result = permutate(str);
System.out.println("Permutation result:");
for(String[] arr: result){
System.out.println(Arrays.toString(arr));
}
这是在main中运行的输出。
Inside the recursion:
[A, B, C]
[A, C, B]
[B, A, C]
[B, C, A]
[C, B, A]
[C, A, B]
Permutation result:
[A, B, C]
[A, B, C]
[A, B, C]
[A, B, C]
[A, B, C]
[A, B, C]
奇怪的是,它在递归函数本身中打印了正确的排列。但是,它没有返回正确的ArrayList。
答案 0 :(得分:2)
您总是修改同一个对象,将代码更改为
if(curr == stop) {
String[] dest = new String[str.length];
System.arraycopy( str, 0, dest, 0, str.length );
result.add(dest);
System.out.println(Arrays.toString(str));
return result;
}
通过
result.add(str);
您正在使用对同一对象的引用填充result
对象。
事实上,如果你从这个
改变你的内心println
System.out.println(Arrays.toString(str));
到这个
for(String[] arr: result)
System.out.println(Arrays.toString(arr));
你会得到这个输出
[A, B, C]
[A, C, B]
[A, C, B]
[B, A, C]
[B, A, C]
[B, A, C]
[B, C, A]
[B, C, A]
[B, C, A]
[B, C, A]
[C, B, A]
[C, B, A]
[C, B, A]
[C, B, A]
[C, B, A]
[C, A, B]
[C, A, B]
[C, A, B]
[C, A, B]
[C, A, B]
[C, A, B]
显示,在每个循环中,您的result
数组元素始终相同