Collections.sort对错误的列表进行排序

时间:2017-11-27 14:40:52

标签: java arrays methods collections

我想从原始列表中创建一个排序列表 - 没有Collections.sort(list)调用更改原始列表。所以我有一个未排序的列表和一个正在排序的列表 - 来自同一个列表。

看看这段代码:

public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList();
    list.add(5);
    list.add(8);
    list.add(3);
    list.add(6);
    System.out.println("Before method list is");
    System.out.println(list);
    ArrayList<Integer> theReturnedList = sorted(list);
    System.out.println("After it is");
    System.out.println(list);
}

private static ArrayList<Integer> sorted(ArrayList<Integer> list){
    ArrayList<Integer> returnList = list;
    Collections.sort(returnList);
    return returnList;
}

list对象被排序 - 即使我没有调用Collection.sort()方法。我怎么能避免它?

因为我认为会发生这种情况......

public static void main(String[] args) {
    String original = "I am an object created in main";
    String theChangedObject = change(original);
    System.out.println(original);
}

private static String change(String string){
    String changed = string;
    changed = "I was changed";
    return changed;
}

对象orginal保持不变。

3 个答案:

答案 0 :(得分:3)

您的问题是对参考如何工作的误解。我们来看看这个方法:

private static ArrayList<Integer> sorted(ArrayList<Integer> list){
    ArrayList<Integer> returnList = list;
    Collections.sort(returnList);
    return returnList;
}

ArrayList<Integer> returnList = list;复制列表。它将引用复制到列表中。这意味着returnListlist都会引用相同的列表。一个中的变化会影响另一个,因为它们实际上只是同一个事物的不同名称。

您要做的是制作一个包含相同值的全新列表,可以使用

完成
ArrayList<Integer> returnList = new ArrayList<>();
returnList.addAll(list);

还有一个方便的ArrayList构造函数可以一步完成:

ArrayList<Integer> returnList = new ArrayList<>(list);

returnList的更改不会影响list,因为它们现在是两个完全独立的列表,恰好包含相同的值。

答案 1 :(得分:3)

在您的sorted方法中,您仍在原始列表中调用Collection.sort。为避免这种情况,你可以创建一个浅拷贝并返回例如。

private static ArrayList<Integer> sorted(ArrayList<Integer> list){
    ArrayList<Integer> returnList = new ArrayList<>(list);
    Collections.sort(returnList);
    return returnList;
}

答案 2 :(得分:0)

您可以使用Stream api

db.submissions.aggregate([
    {
        "$match": {
            "FieldValues.Value": "Craig"
        }
    },
    {
        "$lookup": {
            "from": "aliases",
            "localField": "FieldValues.Name",
            "foreignField": "Fields.Field",
            "as": "R"
        }
    },
    {
        "$unwind": "$R"
    },
    {
        "$unwind": "$R.Fields"
    },
    {
        "$unwind": "$FieldValues"
    }
])

流api提供了几种不可变地处理集合的方法。如果您使用的是Java 8或更高版本,则建议使用此方法。