行业资讯 2025年08月6日
0 收藏 0 点赞 107 浏览 3376 个字
摘要 :

文章目录 对ArrayList进行排序的不同方法 对元素强制执行排序顺序 按自然(升序)顺序对数组列表进行排序 使用 Collection.sort() 对数组列表进行排序 使用 Java 8 流对……




  • 对ArrayList进行排序的不同方法
  • 对元素强制执行排序顺序
  • 按自然(升序)顺序对数组列表进行排序
  • 使用 Collection.sort() 对数组列表进行排序
  • 使用 Java 8 流对数组列表进行排序
  • 总结

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

对ArrayList进行排序的不同方法

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

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

排序方法 何时使用
ArrayList.sort() 就地排序,即修改原始ArrayList。
Collection.sort() 内部其实也是使用了 ArrayList.sort(),没有额外的好处。
Arraylist.stream.sorted() 不修改原始列表并返回新的排序ArrayList。
提供对流元素执行其他操作的机会。

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

对元素强制执行排序顺序

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

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

public record Task(long id, String name, boolean status)
    implements Comparable<Task> {
  @Override
  public int compareTo(Task other) {
    return Long.compare(other.id, this.id);
  }
}

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

Comparator<Task> nameSorter = Comparator.comparing(Task::name);
Comparator<E> reverseSorter = Comparator.reverseOrder();

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

//Create ArrayList
ArrayList<Task> 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));

按自然(升序)顺序对数组列表进行排序

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

请注意,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]
]

使用 Collection.sort() 对数组列表进行排序

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

public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}

出于参考目的,让我们看看使用 Collections.sort() 方法的代码示例:

//自然排序
Collections.sort(arrayList);
//反向排序
Collections.sort(arrayList, Comparator.reverseOrder());
//自定义排序
Collections.sort(arrayList, Comparator.comparing(Task::name));

使用 Java 8 流对数组列表进行排序

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

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

//自然排序
List<Task> sortedList = arrayList.stream().sorted().toList();
//反向排序
List<Task> sortedList = arrayList.stream().sorted(Comparator.reverseOrder()).toList();

下面的示例将筛选操作与流元素上的排序操作组合在一起。它仅选择活动任务,按名称对任务进行排序,并在新列表中收集元素。

//Sorting with filtering
List<Task> 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]
]

总结

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

  • 实现可比较接口进行自然排序,并使用比较器实例进行自定义和反向排序
  • 如果我们想修改原始集合,请使用 List.sort()
  • 如果我们不想修改原始集合,请使用Stream
  • 使用 Collections.sort() 没有任何额外好处,因此可以忽略

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9058.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号