Java Collections.sort对错误列表进行排序
我想从我的原始列表中创建一个已排序的列表-而不使用Java Collections.sort对错误列表进行排序,java,arrays,methods,collections,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.
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;
}
原始对象保持不变。您的问题是对引用如何工作的误解。让我们来看看方法:
private static ArrayList<Integer> sorted(ArrayList<Integer> list){
ArrayList<Integer> returnList = list;
Collections.sort(returnList);
return returnList;
}
还有一个方便的ArrayList
构造函数,它一步完成这一任务:
ArrayList<Integer> returnList = new ArrayList<>(list);
ArrayList returnList=新的ArrayList(列表);
对
returnList
的更改不会影响list
,因为它们现在是两个完全独立的列表,恰好包含相同的值。在sorted
方法中,您仍在调用原始列表上的Collection.sort
。为了避免这种情况,您可以创建一个浅拷贝并返回
private static ArrayList<Integer> sorted(ArrayList<Integer> list){
ArrayList<Integer> returnList = new ArrayList<>(list);
Collections.sort(returnList);
return returnList;
}
已排序的私有静态ArrayList(ArrayList列表){
ArrayList returnList=新的ArrayList(列表);
集合。排序(返回列表);
退货清单;
}
在这一行:
ArrayList<Integer> returnList = list;
这次我们使用原始列表的元素创建另一个ArrayList对象。这样,在对较新的列表进行排序时,原始列表不会更改
这种行为不适用于字符串或LocalDateTime。它们在创建后无法更改其状态,而是返回一个新的副本并应用更改。您可以使用流api
List<Integer> list = Arrays.asList(5,8,3,6);
List<Integer> newList = list.stream().sorted().collect(Collectors.toList());
List-List=Arrays.asList(5,8,3,6);
List newList=List.stream().sorted().collect(Collectors.toList());
流api提供了几种方法来永久地处理集合。如果您使用的是Java 8或更高版本,这是推荐的方法。您认为
ArrayList returnList=list
Do?你了解引用类型是如何工作的吗?@lelelo:除非通过反射,String
s是不可变的——所有会修改字符串的内容都会返回一个包含修改内容的新字符串。所以你永远不会有一个点,一个字符串可以修改,另一个字符串不能修改,因为它们一开始都不能修改。@lelelo阅读进一步的解释。是的,这很有效。为什么我不必用字符串来做呢?字符串方法在Java中是不可变的。你知道哪里有所有不可变对象的完整列表吗?知道这一点很好。这里有一个问题:还有另一个不可变对象列表。还必须包括的类别。
ArrayList<Integer> returnList = list;
private static ArrayList<Integer> sorted(ArrayList<Integer> list){
ArrayList<Integer> returnList = new ArrayList<>(list); // the new keyword creates a new object on the memory heap
Collections.sort(returnList);
return returnList;
}
List<Integer> list = Arrays.asList(5,8,3,6);
List<Integer> newList = list.stream().sorted().collect(Collectors.toList());