修改int数组后存入Stack却全为最终数组?Java数组引用问题求助
问题原因与解决方法
核心原因
Java里数组属于引用类型,你代码中每次调用perm.add(value)时,并没有把当前数组的内容复制一份存进Stack,而是把value数组的引用地址存了进去。整个全排列生成过程中,你一直在修改同一个value数组的元素值,Stack里所有元素其实都指向同一个数组对象。当循环结束时,数组内容已经变成最后一个排列321,所以打印Stack时所有元素显示的都是这个值。
解决方案
每次向Stack添加数组前,先创建当前数组的副本,把副本存入Stack,而不是原数组的引用。可以用Arrays.copyOf()方法快速生成数组副本,该方法会创建一个新数组,并复制原数组的所有元素。
修改后的代码
import java.util.Arrays; import java.util.Stack; public class PermutationExample { public Stack<int[]> perm(int[] labels) { Stack<int[]> perm = new Stack<int[]>(); int[] value = labels; Arrays.sort(value); int k = labels.length; boolean permutationsComplete = false; // 存入数组副本而非原引用 perm.add(Arrays.copyOf(value, value.length)); while (!permutationsComplete) { int i = k - 1; while (i > 0 && value[i - 1] >= value[i]) { i--; } if (i < 1) { permutationsComplete = true; System.out.println(); for(int[] list : perm) { this.printList(list); } return perm; } int j = k; while (value[j - 1] <= value[i - 1]) { j--; } int swap1 = value[i - 1]; value[i - 1] = value[j - 1]; value[j - 1] = swap1; i++; j = k; while (i < j) { int swap2 = value[i - 1]; value[i - 1] = value[j - 1]; value[j - 1] = swap2; i++; j--; } // 同样存入数组副本 perm.add(Arrays.copyOf(value, value.length)); } return null; } private void printList(int[] arr) { for (int num : arr) { System.out.print(num); } System.out.println(); } }
验证效果
修改后,每次存入Stack的都是独立的数组对象,每个对象保存了生成时的排列状态,最后打印Stack时就能正确显示所有不同的全排列了。
内容的提问来源于stack exchange,提问作者Tabiat1739
相关产品推荐
相关产品推荐

