如果我有一个arraylist,我想要一个排序和未排序的版本,我怎么能实现它。
试用了集合
ArrayList<Integer> someNumbers = new ArrayList<>();
如果我然后创建一个新的arraylist = someNumbers并对其进行排序。原始的一个也被排序了吗?
ArrayList<Integer> sortedNumbers = someNumbers;
Collections.sort(sortedNumbers);
两个列表都已排序。
我怎样才能简单地实现我想做的事情? (获得一个已排序的副本,并保持原始的原始顺序)
答案 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);
答案 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);