You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复制存储不可变原始数组副本 解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:15:07