Java Comparable
接口示例
原文: https://howtodoinjava.com/java/collections/java-comparable-interface/
Java Comparable
接口,用于根据对象的自然顺序对对象的数组或列表进行排序。 元素的自然排序是通过在对象中实现compareTo()
方法来实现的。
1. Java Comparable
接口
public interface Comparable<T>
{
public int compareTo(T o);
}
Java Comparable
接口对实现它的每个类的对象强加了总体排序。 此排序称为类的自然排序,而该类的compareTo()
方法也称为其自然比较方法。
使用Comparable
接口,我们可以对以下元素进行排序:
- 字符串对象
- 包装器类对象,例如
Integer
,Long
等 - 用户定义的自定义对象
1.1 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
接口。 包装器类通过它们的值进行比较,字符串在字典上进行比较。
1.2 Collections.sort()
和Arrays.sort()
- 使用
Collections.sort()
方法对对象的列表进行排序。 - 使用
Arrays.sort()
方法对对象的数组进行排序。
1.3 Collections.reverseOrder()
此工具方法返回一个Comparator
,它在实现Comparable
接口的对象集合上强加自然顺序的逆序。
这为排序(或维护)以反自然顺序实现Comparable
接口的对象的集合(或数组)提供了一个简单的习惯用法。
2. Java Comparable
示例
所有给定的示例都使用Collections.sort()
方法对列表进行排序。 如果我们需要对相同对象的数组进行排序,只需将 Collections.sort()
替换为Arrays.sort()
。
2.1 排序字符串列表
Java 程序使用Comparable
接口对字符串列表进行排序。
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]
2.2 以相反的顺序对字符串列表进行排序
Java 程序使用Comparable
接口对字符串列表进行排序。
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);
程序输出:
[E, D, C, B, A]
2.3 排序整数列表
Java 程序使用Comparable
接口对整数列表进行排序。
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]
2.4 排序员工名单
Java 程序使用Comparable
接口对自定义对象列表进行排序。 在此示例中,我们将按 ID 排序员工列表。
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);
程序输出:
[
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 中的员工对象进行排序。
将我的问题放在评论部分。
学习愉快!
参考文献: