程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • JavaAPI速查

    • Java基础API
    • String类常用API
    • StringBuilder常用API
    • Arrays数组 工具类
    • Collections 工具类
    • Java 集合常用API
    • Collection 接口集合的遍历方式
    • Map 接口集合的遍历方式
    • Queue 和 Stack 的常用遍历方式
    • 数组的常用遍历方式
    • 字符串的常用遍历方式
    • 文件或目录的常用遍历方式
    • 比较器的常用使用方式
      • 1. 实现 `Comparable` 接口进行自然排序
      • 2. 实现 `Comparator` 接口进行自定义排序
      • 3. 使用 Lambda 表达式实现 Comparator
      • 4. 使用 `Comparator` 的链式调用进行多条件排序
      • 5. 使用 `Comparator.reverseOrder()` 和 `Comparator.naturalOrder()`
      • 6. 使用 `Comparator` 的自定义比较规则
      • 7. 比较器的使用方式总结
    • 常用日期和时间API
  • JavaAPI速查
  • JavaAPI速查
scholar
2024-08-24
目录

比较器的常用使用方式

# 比较器的常用使用方式

在 Java 中,比较器主要用于对集合进行排序或进行自定义的排序规则定义,主要有两种方式:实现 Comparable 接口和实现 Comparator 接口。

# 1. 实现 Comparable 接口进行自然排序

Comparable 接口用于定义对象的自然排序,通常适用于实体类自身。

  • 方法: int compareTo(T o)
  • 使用场景: 对同一类对象的自然排序,例如按姓名、年龄、ID 等进行排序。
  • 参数说明: T o,需要与当前对象进行比较的对象。

代码示例:

public class Student implements Comparable<Student> {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 实现compareTo方法,按年龄升序排序
    @Override
    public int compareTo(Student other) {
        return Integer.compare(this.age, other.age); // 使用Integer.compare进行比较
    }

    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }

    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("Alice", 22));
        students.add(new Student("Bob", 20));
        students.add(new Student("Charlie", 25));

        // 使用自然排序
        Collections.sort(students);
        System.out.println(students); // 输出按年龄升序排序后的结果
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

使用说明:

  • 实现 Comparable 接口后,该类的对象可以进行自然排序。
  • compareTo 方法返回值为负表示当前对象小于比较对象,为零表示相等,正数表示大于。

# 2. 实现 Comparator 接口进行自定义排序

Comparator 接口用于定义自定义排序规则,适合在不修改实体类的情况下进行排序。

  • 方法: int compare(T o1, T o2)
  • 使用场景: 当需要在不同场景下使用不同的排序规则时,可以通过 Comparator 接口实现。
  • 参数说明: T o1 和 T o2,需要比较的两个对象。

代码示例:

import java.util.*;

public class ComparatorExample {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("Alice", 22));
        students.add(new Student("Bob", 20));
        students.add(new Student("Charlie", 25));

        // 按姓名升序排序
        Comparator<Student> nameComparator = (s1, s2) -> s1.getName().compareTo(s2.getName());
        Collections.sort(students, nameComparator);
        System.out.println("按姓名排序: " + students);

        // 按年龄降序排序
        Comparator<Student> ageComparator = (s1, s2) -> Integer.compare(s2.getAge(), s1.getAge());
        Collections.sort(students, ageComparator);
        System.out.println("按年龄排序: " + students);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

使用说明:

  • Comparator 接口适合在多个场景下进行不同排序规则的实现。
  • compare 方法返回值为负表示 o1 小于 o2,为零表示相等,正数表示 o1 大于 o2。

# 3. 使用 Lambda 表达式实现 Comparator

在 Java 8 及之后的版本中,可以使用 Lambda 表达式简化 Comparator 的实现,尤其适合短小的排序逻辑。

代码示例:

import java.util.*;

public class LambdaComparatorExample {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
                new Student("Alice", 22),
                new Student("Bob", 20),
                new Student("Charlie", 25)
        );

        // 使用Lambda表达式按年龄排序
        students.sort((s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()));
        System.out.println("Lambda 按年龄排序: " + students);

        // 使用Lambda表达式按姓名排序
        students.sort(Comparator.comparing(Student::getName));
        System.out.println("Lambda 按姓名排序: " + students);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

使用说明:

  • Lambda 表达式可以简化 Comparator 的定义,特别适用于单一排序规则的场景。
  • 可以结合 Comparator.comparing 提供更易读的代码。

# 4. 使用 Comparator 的链式调用进行多条件排序

在复杂场景下,可以使用 Comparator 的链式调用对多个字段进行排序,例如先按年龄排序,再按姓名排序。

代码示例:

import java.util.*;

public class MultiComparatorExample {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
                new Student("Alice", 22),
                new Student("Bob", 20),
                new Student("Charlie", 22)
        );

        // 先按年龄升序排序,再按姓名升序排序
        students.sort(Comparator.comparing(Student::getAge).thenComparing(Student::getName));
        System.out.println("多条件排序: " + students);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

使用说明:

  • 使用 Comparator.comparing 和 thenComparing 可以实现多条件排序,排序规则按链式调用顺序应用。
  • 适合处理复杂排序规则的场景。

# 5. 使用 Comparator.reverseOrder() 和 Comparator.naturalOrder()

Java 提供了内置的自然顺序和逆序比较器,可以直接使用。

代码示例:

import java.util.*;

public class ComparatorOrderExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 3, 8, 1, 9);

        // 自然顺序排序
        numbers.sort(Comparator.naturalOrder());
        System.out.println("自然顺序排序: " + numbers);

        // 逆序排序
        numbers.sort(Comparator.reverseOrder());
        System.out.println("逆序排序: " + numbers);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

使用说明:

  • Comparator.naturalOrder() 按自然顺序排序,适用于基本类型和实现了 Comparable 的类。
  • Comparator.reverseOrder() 按逆序排序,适用于基本类型和实现了 Comparable 的类。

# 6. 使用 Comparator 的自定义比较规则

Comparator 可以通过传递自定义比较规则来实现复杂的比较逻辑。

代码示例:

import java.util.*;

public class CustomComparatorExample {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("Apple", "Banana", "Orange", "Mango");

        // 自定义排序规则:按字符串长度排序
        Comparator<String> lengthComparator = (f1, f2) -> Integer.compare(f1.length(), f2.length());
        fruits.sort(lengthComparator);

        System.out.println("按字符串长度排序: " + fruits);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

使用说明:

  • 自定义比较规则适合需要灵活定义排序条件的场景,例如按字符串长度、按日期、按自定义权重排序等。

# 7. 比较器的使用方式总结

  1. Comparable 接口 适用于类自身的自然排序,通常应用于实体类中,提供了 compareTo 方法。
  2. Comparator 接口 提供了灵活的自定义排序方式,适用于需要多种排序规则的场景。
  3. Lambda 表达式 可以简化 Comparator 的实现,特别是对于短小的排序逻辑。
  4. 链式调用 允许组合多个排序条件,适用于复杂的排序需求。
  5. 内置的自然顺序和逆序比较器 提供了简便的排序方式。
  6. 自定义比较规则 通过传递自定义的逻辑,可以处理复杂的排序场景。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
文件或目录的常用遍历方式
常用日期和时间API

← 文件或目录的常用遍历方式 常用日期和时间API→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式