如何取消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
相关产品推荐
相关产品推荐

