java8的Comparator排序

文章展示了如何使用Java8的Lambda表达式结合Comparator对Person对象列表按年龄进行升序和降序排序。同时,文中还讲解了如何处理排序字段为null的情况,利用Comparator.nullsFirst和Comparator.nullsLast来设定null值的排序位置。

简单示例

代码示例参考: Java 8 Lambda 和 Comparator 排序

@Data
@AllArgsConstructor
public class Person {
    private String name;
    private Integer age;
}

Comparator.comparing(),默认按照指定字段升序。
使用reversed()方法,降序

List<Person> list = new ArrayList<>();
        list.add(new Person("老王", 20));
        list.add(new Person("老李", 10));
        list.add(new Person("老徐", 28));
        list.add(new Person("老陈", 18));
        list.add(new Person("老艾", 31));

        list.stream().sorted(Comparator.comparing(Person::getAge)).forEach(System.out::println);
        log.info("-----------------------------");
        list.stream().sorted(Comparator.comparing(Person::getAge).reversed()).forEach(System.out::println);

输出:
请添加图片描述

比较字段null值的处理:Comparator.nullsFirst、Comparator.nullsLast

        List<Person> list = new ArrayList<>();
        list.add(new Person("老王", 20));
        list.add(new Person("老李", 10));
        list.add(new Person("老徐", 28));
        list.add(new Person("老陈", 18));
        list.add(new Person("老艾", null));

        list.stream().sorted(Comparator.comparing(Person::getAge,Comparator.nullsFirst(Integer::compareTo))).forEach(System.out::println);
        log.info("-----------------------------");
        list.stream().sorted(Comparator.comparing(Person::getAge,Comparator.nullsFirst(Integer::compareTo)).reversed()).forEach(System.out::println);

输出:
请添加图片描述

### Java 中使用 Comparator 对队列进行排序Java 中,`Comparator` 接口允许我们自定义对象之间的比较逻辑。通过实现 `compare(T o1, T o2)` 方法,我们可以指定两个对象的相对顺序[^2]。当需要对集合中的元素按照特定规则排序时,可以通过传递一个定制化的 `Comparator` 来完成。 下面展示了一个具体的例子,说明如何使用匿名内部类来创建一个基于 ID 的 `Comparator` 并将其应用于优先级队列(PriorityQueue)。此代码片段展示了如何利用 `Comparator` 实现自定义排序: ```java import java.util.PriorityQueue; import java.util.Comparator; class Item { int id; String name; public Item(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "Item{id=" + id + ", name='" + name + "'}"; } } public class Main { public static void main(String[] args) { // 创建一个带有自定义 Comparator 的 PriorityQueue PriorityQueue<Item> pq = new PriorityQueue<>(new Comparator<Item>() { @Override public int compare(Item i1, Item i2) { return Integer.compare(i1.id, i2.id); // 按照 id 升序排列 } }); // 添加一些项目到队列中 pq.add(new Item(3, "C")); pq.add(new Item(1, "A")); pq.add(new Item(2, "B")); // 输出按 id 排序后的结果 while (!pq.isEmpty()) { System.out.println(pq.poll()); } } } ``` 在这个示例中,`PriorityQueue` 使用了自定义的 `Comparator` 进行初始化。该 `Comparator` 定义了 `Item` 类型的对象应根据其 `id` 字段升序排列[^1]。每次调用 `poll()` 方法时,都会返回当前队列中具有最小 `id` 值的项。 #### 关于 Priority Queue 和 Sorting 的应用 优先队列是一种常用的数据结构,在许多场景下都可以用来实现高效的排序算法。例如,上述提到的 `PriorityQueueSort` 算法就是一种典型的基于优先队列的排序方式[^3]。它的基本思路是先将所有数据插入到空的优先队列中,再依次提取这些数据并重新存储回原列表中,从而达到排序的目的。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值