集合在Arraylist的副本上排序(保持原始顺序)

时间:2017-01-04 13:24:24

标签: java sorting arraylist collections

如果我有一个arraylist,我想要一个排序和未排序的版本,我怎么能实现它。

试用了集合

ArrayList<Integer> someNumbers = new ArrayList<>();

如果我然后创建一个新的arraylist = someNumbers并对其进行排序。原始的一个也被排序了吗?

ArrayList<Integer> sortedNumbers = someNumbers;
Collections.sort(sortedNumbers);

两个列表都已排序。

我怎样才能简单地实现我想做的事情? (获得一个已排序的副本,并保持原始的原始顺序)

5 个答案:

答案 0 :(得分:11)

执行ArrayList<Integer> sortedNumbers = someNumbers;时,您没有创建要排序的新列表。您基本上将变量sortedNumbers分配给someNumbers分配给的完全相同的列表。

要修复此问题,您可以从其他列表中创建新列表。像这样:

ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers);

答案 1 :(得分:3)

您需要复制一份清单然后对其进行排序,例如

ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers);
Collections.sort(sortedNumbers);

这使用ArrayList(java.util.Collection)构造函数

答案 2 :(得分:3)

两个列表排序的原因是因为即使您首先创建new ArrayList(),也会使用对someNumbers的引用覆盖此实例。因此,当您对sortedNumbers进行排序时,实际上会对原始列表someNumbers进行排序。

您可以通过多种方式实现目标:

ArrayList<Integer> sortedNumbers = new ArrayList<>();
sortedNumbers.addAll(someNumbers);

或者您可以使用复制构造函数一步完成相同的操作:

ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers);

答案 3 :(得分:2)

只需复制数组并对副本进行排序:

ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers);
Collections.sort(sortedNumbers);

答案 4 :(得分:2)

您必须先将ArrayList复制为两个版本。然后,您可以对两个ArrayLists中的一个进行排序

ArrayList<Integer> someNumbers = ...
ArrayList<Integer> sortedNumbers = new ArrayList<>(someNumbers);
Collections.sort(sortedNumbers);