Collections.sort()会影响所有ArrayLists。我如何只排序一个列表而不排序其他列表?

时间:2016-04-20 04:19:33

标签: java sorting arraylist

我有三个ArrayLists:
一个用于按照输入的顺序存储用户输入,位于主类中 第二个与第一个完全相同,但它被传递到一个名为remTrip的方法中进行复制并返回结果。
第三个是下面代码中的list1,这是正在处理的代码。

public static ArrayList<String> remTrip( ArrayList<String> a){
    //code here
    ArrayList<String> list1 = a;
    Collections.sort(list1);
    //code to remove triplicates from the list and returns the result
}

我希望保持第一个ArrayList<String>与它的顺序相同(即{"dog", "cat" , "tiger", "cat", "cat"}),但显然Collections.sort()对所有ArrayLists进行排序。

如何只对其中一个列表进行排序而不对其他列表进行排序?

2 个答案:

答案 0 :(得分:6)

问题不在于list1的工作原理。问题是,不是创建列表的副本,而是将新列表设置为等于列表。这意味着它们都指向同一个对象,排序一个会对另一个进行排序,因为它们是同一个东西。要解决此问题,请将a设置为ArrayList<String> list1 = new ArrayList<String>(a); 的副本,而不是将它们设置为相等。

你应该能够做到

a=[]
for i in xrange(3):
     a.append([])
     for j in xrange(3):
        a[i].append(i+j)
print a
print a[0,2]

答案 1 :(得分:3)

你所谈论的三个集会主义者并不是三个不同的arraylists。它们只是对同一个arraylist的三个不同的引用。

你所做的基本上是 -

List list01 = new ArrayList();
List list02 = list01;
List list03 = list01;

你想要的是什么 -

List list01 = new ArrayList();
List list02 = new ArrayList(list01);
List list03 = new ArrayList(list01);

但你应该记住,这种方式会给你一份你的List,而不是它的所有元素。因此,如果您更改复制列表中的某个元素,它也会在原始列表中更改。

如何解决 - 提示copy constructor