Java冒泡排序存每轮迭代结果到ArrayList出现重复如何解决
问题原因
- Java中数组是引用数据类型,你代码中全程操作的都是同一个
age数组对象,调用fe.add(age)时,只是把age数组的内存地址存入了ArrayList,并没有拷贝数组的实际内容。 - 第二轮冒泡迭代时修改了同一个
age数组的内容,会导致ArrayList里之前存入的地址指向的内容同步被修改,最终列表里两个位置存的都是同一个数组的地址,指向的都是第二轮迭代结束后的数组值,所以输出两次相同结果。
修复方案
每次把数组存入ArrayList前,生成当前数组的副本存入即可,修改fe.add(age)这行代码为:
fe.add(Arrays.copyOf(age, age.length));
修改后完整运行代码如下:
public static void main(String[] args) { Integer[] age = {5,4,3,2,1}; ArrayList<Integer[]> fe = new ArrayList<Integer[]>(); for(int i=0;i<2;i++) { for(int ii=1;ii<5;ii++) { if(age[ii]<age[ii-1]) { int x = age[ii]; age[ii]=age[ii-1]; age[ii-1]=x; } } System.out.println("result "+Arrays.toString(age)+"\n"); // 存入数组副本而非原数组引用 fe.add(Arrays.copyOf(age, age.length)); } for(Integer[] f : fe) { System.out.print(Arrays.toString(f)); } }
运行后即可得到预期输出[4, 3, 2, 1, 5][3, 2, 1, 4, 5]。
内容的提问来源于stack exchange,提问作者Bryxter Bulisig
相关产品推荐
相关产品推荐

