多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Java `Comparable`接口示例 > 原文: [https://howtodoinjava.com/java/collections/java-comparable-interface/](https://howtodoinjava.com/java/collections/java-comparable-interface/) Java `Comparable`接口,用于根据对象的**自然顺序**对对象的[数组](https://howtodoinjava.com/java-array/)或[列表](https://howtodoinjava.com/java-arraylist/)进行排序。 元素的自然排序是通过在对象中实现`compareTo()`方法来实现的。 ## 1\. Java `Comparable`接口 ```java public interface Comparable<T> { public int compareTo(T o); } ``` Java `Comparable`接口对实现它的每个类的对象强加了总体排序。 此排序称为类的**自然排序**,而该类的`compareTo()`方法也称为其自然比较方法。 使用`Comparable`接口,我们可以对以下元素进行排序: 1. 字符串对象 2. 包装器类对象,例如`Integer`,`Long`等 3. 用户定义的自定义对象 #### 1.1 `compareTo()`方法 对于任何支持自然排序的类,它都应实现`Comparable`接口并覆盖其`compareTo()`方法。 它必须返回负整数,零或正整数,因为此对象小于,等于或大于指定的对象。 请注意,如果`y.compareTo(x)`引发异常,则方法必须引发异常。 关系也必须是**可传递**,即(`x.compareTo(y) > 0 && y.compareTo(z) > 0`)表示`x.compareTo(z)> 0`。 例如,对于`Employee`类,自然排序可以基于其员工`id`。 ```java import java.time.LocalDate; public class Employee implements Comparable<Employee> { private Long id; private String name; private LocalDate dob; @Override public int compareTo(Employee o) { return this.getId().compareTo( o.getId() ); } } ``` 所有包装器类和`String`类都实现`Comparable`接口。 [包装器类](https://howtodoinjava.com/java/basics/java-wrapper-classes/)通过它们的值进行比较,字符串在字典上进行比较。 #### 1.2 `Collections.sort()`和`Arrays.sort()` 1. 使用`Collections.sort()`方法对对象的**列表**进行排序。 2. 使用`Arrays.sort()`方法对对象的**数组**进行排序。 #### 1.3 `Collections.reverseOrder()` 此工具方法返回一个`Comparator`,它在实现`Comparable`接口的对象集合上强加*自然顺序*的逆序。 这为排序(或维护)以**反自然顺序**实现`Comparable`接口的对象的集合(或数组)提供了一个简单的习惯用法。 ## 2\. Java `Comparable`示例 所有给定的示例都使用`Collections.sort()`方法对列表进行排序。 如果我们需要对相同对象的数组进行排序,只需将 `Collections.sort()`替换为`Arrays.sort()`。 #### 2.1 排序字符串列表 Java 程序使用`Comparable`接口对字符串列表进行排序。 ```java ArrayList<String> list = new ArrayList<>(); list.add("E"); list.add("A"); list.add("C"); list.add("B"); list.add("D"); Collections.sort(list); System.out.println(list); ``` 程序输出。 ```java [A, B, C, D, E] ``` #### 2.2 以相反的顺序对字符串列表进行排序 Java 程序使用`Comparable`接口对字符串列表进行排序。 ```java ArrayList<String> list = new ArrayList<>(); list.add("E"); list.add("A"); list.add("C"); list.add("B"); list.add("D"); //Sort in reverse natural order Collections.sort(list, Collections.reverseOrder()); System.out.println(list); ``` 程序输出: ```java [E, D, C, B, A] ``` #### 2.3 排序整数列表 Java 程序使用`Comparable`接口对整数列表进行排序。 ```java ArrayList<Integer> list = new ArrayList<>(); list.add(10); list.add(300); list.add(45); list.add(2); list.add(5); //Natural order Collections.sort(list); System.out.println(list); //Sort in reverse natural order Collections.sort(list, Collections.reverseOrder()); System.out.println(list); ``` 程序输出: ```java [2, 5, 10, 45, 300] [300, 45, 10, 5, 2] ``` #### 2.4 排序员工名单 Java 程序使用`Comparable`接口对自定义对象列表进行排序。 在此示例中,我们将**按 ID** 排序员工列表。 ```java ArrayList<Employee> list = new ArrayList<>(); list.add(new Employee(22l, "Lokesh", LocalDate.now())); list.add(new Employee(18l, "Alex", LocalDate.now())); list.add(new Employee(30l, "Bob", LocalDate.now())); list.add(new Employee(600l, "Charles", LocalDate.now())); list.add(new Employee(5l, "David", LocalDate.now())); //Natural order Collections.sort(list); System.out.println(list); //Sort in reverse natural order Collections.sort(list, Collections.reverseOrder()); System.out.println(list); ``` 程序输出: ```java [ Employee [id=5, name=David, dob=2018-10-29], Employee [id=18, name=Alex, dob=2018-10-29], Employee [id=22, name=Lokesh, dob=2018-10-29], Employee [id=30, name=Bob, dob=2018-10-29], Employee [id=600, name=Charles, dob=2018-10-29] ] //Reverse sorted [ Employee [id=600, name=Charles, dob=2018-10-30], Employee [id=30, name=Bob, dob=2018-10-30], Employee [id=22, name=Lokesh, dob=2018-10-30], Employee [id=18, name=Alex, dob=2018-10-30], Employee [id=5, name=David, dob=2018-10-30] ] ``` ## 3\. 总结 在本教程中,我们学习了 Java 集合框架的`Comparable`接口。 它有助于通过简单的接口实现对对象施加自然顺序。 我们学习了对字符串列表,字符串数组,整数列表,整数数组进行排序,并学习了如何使用可比性对 Java 中的员工对象进行排序。 将我的问题放在评论部分。 学习愉快! 参考文献: [`Comparable`接口 Java 文档](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)