我只需要在类成员字段上对自定义对象的Arraylist进行排序。我只需要向用户显示一些信息。我尝试使用comparator,但是它正在修改我不想要的实际List。因此,为了解决此问题,我对Arraylist进行了深拷贝,并对克隆的Arraylist进行了排序。是否有一种内存有效的方法可以做到这一点而无需创建重复的Arraylist?
好吧,除非您Comparator
突变了对象,否则实际上并不需要进行深层复制,而应该这样做。因此,最简单的方法是进行浅表复制:
ArrayList<String> original = new ArrayList<>();
ArrayList<String> copy = new ArrayList<>(original);
copy.sort(Comparator.naturalOrder());
用您的实际Comparator.naturalOrder()
实现替换Comparator
。例如,如果要比较成员字段,则可以使用Comparator.comparing
作为创建所需Comparator
的简便方法。
并回答您的问题:不,没有附加的数据结构是不可能的,因为一方面您想更改元素的顺序,即对它们进行排序,另一方面,您希望它们保持相同订单。
据我所知,您想按原样打印数组列表,而不更改其原始排序。如果需要的话,您可以制作一个临时数组列表或一个数组,然后将排序后的项目保存在其中,然后将它们打印出来,最后将其删除(在Java中,如果您声明了局部作用域变量,则在程序离开其作用域时将被删除)
您可以使用流。只需串流原始列表,对元素进行排序,然后创建一个新列表。但是列表中的Objects
必须实现Comparable
接口,否则您将需要创建Comparator
来控制排序。
List<Integer> newList =
original.stream().sorted(Comparator.naturalOrder())
.collect(Collectors.toList());
假设您有一个Student
班,您想按年龄对学生列表进行排序。假设您有一个getAge
方法,您可以这样做。
List<Student> newList =
listOfStudents.stream().sorted(Comparator.comparing(Student::getAge))
.collect(Collectors.toList());
以上两种方法均未更改原始列表。