如何复制存储不可变原始数组副本 解决Java多排序算法调用时原数组被修改问题
问题根因
- Java中数组是引用类型,
final修饰数组仅能保证数组变量的指向不会变更,无法限制数组内部元素的修改,因此你之前用final做不可变备份的方案不生效。 - 你的所有排序方法直接修改全局数组
array_elements的元素值,第一次排序后全局数组就变为有序状态,后续所有排序操作拿到的都是已排序的数组。
修复方案
步骤1:新增原始数组备份变量
在静态变量定义区域新增原始数组备份字段:
static int[] array_elements; static int[] original_array; // 新增原始数组备份字段 static int limit; // 其他原有静态变量保持不变
步骤2:用户输入完成后备份原始数组
在user方法中,用户输入完所有数组元素后,立即对原始数组做深拷贝存入备份字段,基础类型数组使用clone()方法可直接完成深拷贝,无需额外导包:
for(ctr = 0; ctr <= limit -1; ctr++){ System.out.print("Enter element "+(ctr+1)+" :\t"); array_elements[ctr] = in.nextInt(); } original_array = array_elements.clone(); // 新增:备份用户输入的原始数组 System.out.println(); Back();
步骤3:每次执行排序前恢复原始数组
在menu方法的switch分支中,调用具体排序方法前,先把备份的原始数组拷贝一份给当前排序用的数组,保证每次排序都用全新的原始数组:
switch(choices){ case 1: array_elements = original_array.clone(); // 新增:恢复原始数组 BubbleSort(); break; case 2: array_elements = original_array.clone(); // 新增:恢复原始数组 selectionSort(); break; case 3: array_elements = original_array.clone(); // 后续新增排序算法也要加这行 // 插入排序逻辑 break; case 4: Exit(); break; default: System.out.print("ERROR"); System.out.println("\u000c"); menu(); break; }
额外优化建议
你当前把循环变量i、j、ctr等都定义为全局静态变量,容易出现不同方法间变量值覆盖的问题,建议把这些循环变量改成方法内部的局部变量,避免逻辑异常。
内容的提问来源于stack exchange,提问作者user17069403
相关产品推荐
相关产品推荐

