我想从原始列表中创建一个排序列表 - 没有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
保持不变。
答案 0 :(得分:3)
您的问题是对参考如何工作的误解。我们来看看这个方法:
private static ArrayList<Integer> sorted(ArrayList<Integer> list){
ArrayList<Integer> returnList = list;
Collections.sort(returnList);
return returnList;
}
第ArrayList<Integer> returnList = list;
行不复制列表。它将引用复制到列表中。这意味着returnList
和list
都会引用相同的列表。一个中的变化会影响另一个,因为它们实际上只是同一个事物的不同名称。
您要做的是制作一个包含相同值的全新列表,可以使用
完成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或更高版本,则建议使用此方法。