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

如何取消List的打乱操作?已执行Collections.shuffle后的恢复方法

嘿,这个场景我之前处理过,咱们来理清楚怎么解决这个问题:

如何恢复被Collections.shuffle打乱的数组顺序

首先得明确一个关键细节:你用Collections.shuffle(Arrays.asList(my_list))的时候,原数组my_list的元素顺序已经被直接修改了。这是因为Arrays.asList()针对对象数组(比如你的Person[])返回的是一个基于原数组的List视图,不是独立的新集合——shuffle操作会直接作用在原数组上,而且Java的Collections.shuffle没有内置的撤销机制,不会保存打乱前的顺序。

所以要恢复原顺序,有两种可行的思路:

1. 提前备份原数组(最稳妥的方案)

如果你的代码还能调整,建议在执行shuffle之前先备份原数组。这样后续要恢复的时候直接把备份的内容复制回去就行:

// 初始化原数组
Person[] my_list = new Person[14];
for (int i = 0; i < 14; i++) {
    my_list[i] = new Person("number " + i);
}

// 备份原数组(创建一个完全独立的副本)
Person[] originalOrder = Arrays.copyOf(my_list, my_list.length);

// 执行打乱操作
Collections.shuffle(Arrays.asList(my_list));

// 需要恢复原顺序时,把备份数组的内容复制回去
System.arraycopy(originalOrder, 0, my_list, 0, originalOrder.length);

2. 未提前备份?重新生成/排序恢复

如果已经错过了备份时机,那只能利用你初始化的规则来恢复:

方法A:直接重新初始化数组

因为你的Person对象是按"number " + i的固定规则创建的,直接重新生成一遍就能得到原顺序:

// 重新生成原顺序的数组元素
for (int i = 0; i < 14; i++) {
    my_list[i] = new Person("number " + i);
}

方法B:对现有数组按name字段排序

如果不想重新创建对象,可以给数组排序。前提是Person类有获取name的方法,比如getName():

// 按name里的数字排序,恢复原顺序
Arrays.sort(my_list, (person1, person2) -> {
    // 提取name中的数字部分并转为整数
    int num1 = Integer.parseInt(person1.getName().replace("number ", ""));
    int num2 = Integer.parseInt(person2.getName().replace("number ", ""));
    return Integer.compare(num1, num2);
});

总结一下:如果能提前备份就优先备份,这是最可靠的方式;如果没备份,就利用初始化的规则重新生成或排序。

内容的提问来源于stack exchange,提问作者Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:56:32