Java ArrayList 排序:升序和降序

Java ArrayList 排序:升序和降序

文章目录

1. 对 ArrayList 进行排序的不同方法

2. 对元素强制排序

2.按自然(升序)顺序对ArrayList进行排序

3.使用Collection.sort()对ArrayList进行排序

4.使用 Java 8 Streams 对ArrayList进行排序

5. 结论

学习使用ArrayList.sort()、Collections.sort()、Comparator接口和 Java 8 Streams在 Java 中对ArrayList进行排序。我们可以使用相同的方法对ArrayList中存储的元素进行自然排序以及逆序排序。

1. 对 ArrayList 进行排序的不同方法

ArrayList是有序且未排序的元素集合,是Java Collections 框架的一部分,类似于其他类(例如LinkedList或HashSet )。默认情况下,添加到ArrayList中的元素按照插入的顺序存储。

当我们需要对ArrayList中的元素进行排序时,可以使用以下技术:

排序方式

何时使用

ArrayList.sort()

对于就地排序,即修改原始数组列表。

集合.sort()

内部使用ArrayList.sort() ,没有额外的好处。

Arraylist.stream.sorted()

不修改原始列表并返回新的排序数组列表。

提供对流元素执行其他操作的机会。

默认情况下,上述所有方法都按自然顺序(即升序)对元素进行排序。我们可以使用提供自定义排序的Comparator实例来实现自定义顺序,例如Collections.reverseOrder()用于元素的相反顺序。

2. 对元素强制排序

对于任何需要按自然顺序存储和排序的对象,在不使用Comparator 的情况下,我们必须实现Comparable接口并编写逻辑来比较两个实例。为了演示排序示例,我们将存储Task的实例。

当然,排序顺序是按id字段对任务进行排序。

public record Task(long id, String name, boolean status)

implements Comparable {

@Override

public int compareTo(Task other) {

return Long.compare(other.id, this.id);

}

}

对于自定义排序,我们可以创建具有适当排序逻辑的Comparator实例。例如,我们可以按名称字段对任务进行排序。当元素(要存储在列表中)未实现Comparable接口时,比较器非常有用。

Comparator nameSorter = Comparator.comparing(Task::name);

Comparator reverseSorter = Comparator.reverseOrder();

最后,为了演示,我们创建一个包含 5 个任务的数组列表,如下所示:

//Create ArrayList

ArrayList arrayList = new ArrayList<>();

//Add items

arrayList.add(new Task(1, "One", true));

arrayList.add(new Task(2, "Two", false));

arrayList.add(new Task(3, "Three", true));

arrayList.add(new Task(4, "Four", false));

arrayList.add(new Task(5, "Five", true));

2.按自然(升序)顺序对ArrayList进行排序

sort ()是List接口的一部分,自 Java 8 起已在ArrayList类中实现。它需要一个用于强制排序顺序的Comparator实例。

请注意,ArrayList.sort()方法执行就地排序,即它修改原始列表。

arrayList.sort(Comparator.naturalOrder());

程序输出:

[

Task[id=1, name=One, status=true],

Task[id=2, name=Two, status=false],

Task[id=3, name=Three, status=true],

Task[id=4, name=Four, status=false],

Task[id=5, name=Five, status=true]

]

要按相反顺序排序,我们可以使用 Comparator.reverseOrder (),它返回一个强制执行与自然顺序相反的比较器。

arrayList.sort(Comparator.reverseOrder());

程序输出:

[

Task[id=5, name=Five, status=true],

Task[id=4, name=Four, status=false],

Task[id=3, name=Three, status=true],

Task[id=2, name=Two, status=false],

Task[id=1, name=One, status=true]

]

类似地,我们也可以使用自定义比较器应用自定义排序。

arrayList.sort(Comparator.comparing(Task::name));

程序输出按名称排序打印任务。

[

Task[id=5, name=Five, status=true],

Task[id=4, name=Four, status=false],

Task[id=1, name=One, status=true],

Task[id=3, name=Three, status=true],

Task[id=2, name=Two, status=false]

]

3.使用Collection.sort()对ArrayList进行排序

Collection.sort () 的工作方式与List.sort()非常相似。事实上,它在内部使用list.sort()方法,因此建议使用List.sort()代替Collections.sort()。

public static void sort(List list, Comparator c) {

list.sort(c);

}

为了便于参考,让我们看一下使用Collections.sort()方法的代码示例:

//Natural order

Collections.sort(arrayList);

//Reverse order

Collections.sort(arrayList, Comparator.reverseOrder());

//Custom order

Collections.sort(arrayList, Comparator.comparing(Task::name));

4.使用 Java 8 Streams 对ArrayList进行排序

使用 Java 流提供了在同一语句中对已排序元素应用其他中间操作的机会。

当我们不想修改原始 arraylist而是临时对列表进行排序并对排序后的元素执行一些操作时,流会更有用。

//Natural order

List sortedList = arrayList.stream().sorted().toList();

//Reverse order

List sortedList = arrayList.stream().sorted(Comparator.reverseOrder()).toList();

以下示例将过滤操作与流元素上的排序操作结合起来。它仅选择活动任务,按名称对任务进行排序,并将元素收集到新的List中。

//Sorting with filtering

List list = arrayList.stream()

.filter(t -> t.status())

.sorted(Comparator.comparing(Task::name))

.toList();

程序输出:

[ Task[id=5, name=Five, status=true],

Task[id=1, name=One, status=true],

Task[id=3, name=Three, status=true]

]

5. 结论

总之,我们可以说在大多数情况下对数组列表进行排序是简单且容易的。对于具体情况,最好了解需求并使用定制的解决方案:

实现Comparable接口以进行自然排序,并使用Comparator实例进行自定义和反向排序

如果我们想修改原始集合,请使用List.sort()

如果我们不想修改原始集合,请使用Streams

使用Collections.sort()没有任何好处,因此可以避免

版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。本文链接:https://www.panziye.com/back/7795.html

喜欢 (0)赏【请潘老师喝杯Coffee吧!】分享 (0)

相关推荐