Java Comparable 示例
所有给定的示例都使用 Collections.sort() 方法对列表进行排序。
如果我们需要对相同对象的数组进行排序,只需将 Collections.sort() 替换为 Arrays.sort() 。
对字符串列表进行排序
使用 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);
输出:
[A, B, C, D, E]
排序整数列表
使用 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);
输出:
[2, 5, 10, 45, 300] [300, 45, 10, 5, 2]
Java Comparable 接口
public interface Comparable<T> { public int compareTo(T o); }
compareTo() 方法
对于任何支持自然排序的类,它应该实现 Comparable 接口并覆盖它的 compareTo() 方法。
它必须返回负整数、零或者正整数,因为此对象小于、等于或者大于指定的对象。
请注意,如果 y.compareTo(x)
抛出异常,则该方法必须抛出异常。
此外,关系必须是可传递的,例如:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味着 x.compareTo(z)>0 。
例如,对于Employee
类,自然排序可以基于它的雇员id
。
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 接口。
包装类按它们的值进行比较,字符串按字典序进行比较。
Collections.sort() 和 Arrays.sort()
- 使用 Collections.sort() 方法对对象列表进行排序。
- 使用 Arrays.sort() 方法对对象数组进行排序。
Collections.reverseOrder()
此实用程序方法返回一个 Comparator,该 Comparator 对实现 Comparable 接口的对象集合强加自然顺序的相反顺序。
这为排序(或者维护)以反向自然顺序实现 Comparable 接口的对象的集合(或者数组)提供了一个简单的习惯用法。
Java Comparable 接口用于根据对象的自然顺序对数组或者对象列表进行排序。
Java Comparable 接口对实现它的每个类的对象强加了总排序。
这种排序称为类的自然排序,类的 compareTo() 方法称为其自然比较方法。
使用 Comparable 接口,我们可以对以下元素进行排序:
- 字符串对象
- 包装类对象,例如 Integer、Long 等
- 用户定义的自定义对象