在不修改原始列表的情况下排序数组列表

问题描述 投票:0回答:3

我只需要在类成员字段上对自定义对象的Arraylist进行排序。我只需要向用户显示一些信息。我尝试使用comparator,但是它正在修改我不想要的实际List。因此,为了解决此问题,我对Arraylist进行了深拷贝,并对克隆的Arraylist进行了排序。是否有一种内存有效的方法可以做到这一点而无需创建重复的Arraylist?

java sorting arraylist comparator
3个回答
3
投票

好吧,除非您Comparator突变了对象,否则实际上并不需要进行深层复制,而应该这样做。因此,最简单的方法是进行浅表复制:

ArrayList<String> original = new ArrayList<>();
ArrayList<String> copy = new ArrayList<>(original);
copy.sort(Comparator.naturalOrder());

用您的实际Comparator.naturalOrder()实现替换Comparator。例如,如果要比较成员字段,则可以使用Comparator.comparing作为创建所需Comparator的简便方法。

并回答您的问题:不,没有附加的数据结构是不可能的,因为一方面您想更改元素的顺序,即对它们进行排序,另一方面,您希望它们保持相同订单。


0
投票

据我所知,您想按原样打印数组列表,而不更改其原始排序。如果需要的话,您可以制作一个临时数组列表或一个数组,然后将排序后的项目保存在其中,然后将它们打印出来,最后将其删除(在Java中,如果您声明了局部作用域变量,则在程序离开其作用域时将被删除)


0
投票

您可以使用流。只需串流原始列表,对元素进行排序,然后创建一个新列表。但是列表中的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());

以上两种方法均未更改原始列表。

© www.soinside.com 2019 - 2024. All rights reserved.