Comparable 接口是一个非常重要的接口,可以被 Java 集合用来比较自定义对象并对它们进行排序。使用 Comparable 接口,我们可以像使用包装类和字符串对象的集合排序方法一样来对自定义对象进行排序。
使用 Comparable,我们可以使元素变得可排序。
Comparable 接口的方法
Comparable 接口定义了一个方法:compareTo()
。compareTo()
方法,如下所示,用于比较传递的对象以确定其顺序:
compare() 方法
int compareTo(Object obj)
obj
是要比较的对象。如果对象相等,则此方法返回零。如果当前对象大于 obj
则返回正值。否则返回负值。
通过重写 compareTo()
方法,你可以改变对象的排序方式。例如,为了逆序排序,你可以实现一个反转比较结果的比较方法。
equals() 方法
boolean equals(Object obj)
obj
是要测试等价性的对象。如果 obj
和调用对象都是 Comparator 对象并且使用相同的排序规则,则返回 true。否则返回 false。
重写 equals()
通常是不必要的,并且大多数简单的比较器不会这样做。
使用 Comparable 接口对自定义对象进行排序
在这个示例中,我们使用 Comparable 接口根据比较标准对自定义对象 Dog 进行排序。
示例
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Dog implements Comparable<Dog> {
private String name;
private int age;
Dog() {
}
Dog(String n, int a) {
name = n;
age = a;
}
public String getDogName() {
return name;
}
public int getDogAge() {
return age;
}
public int compareTo(Dog d) {
return (this.name).compareTo(d.name);
}
@Override
public String toString() {
return this.name + "," + this.age;
}
}
public class ComparableDemo {
public static void main(String args[]) {
List<Dog> list = new ArrayList<>();
list.add(new Dog("Shaggy", 3));
list.add(new Dog("Lacy", 2));
list.add(new Dog("Roger", 10));
list.add(new Dog("Tommy", 4));
list.add(new Dog("Tammy", 1));
Collections.sort(list);
System.out.println("按名字排序:");
System.out.print(list);
}
}
输出
按名字排序:
[Lacy,2, Roger,10, Shaggy,3, Tammy,1, Tommy,4]
注意
Arrays 类的排序与 Collections 类相同。
使用 Comparable 接口对自定义对象进行逆序排序
示例
在这个示例中,我们使用 Collections.reverseOrder()
方法来逆序排序 Dog 对象。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Dog implements Comparable<Dog> {
private String name;
private int age;
Dog() {
}
Dog(String n, int a) {
name = n;
age = a;
}
public String getDogName() {
return name;
}
public int getDogAge() {
return age;
}
public int compareTo(Dog d) {
return (this.name).compareTo(d.name);
}
@Override
public String toString() {
return this.name + "," + this.age;
}
}
public class ComparableDemo {
public static void main(String args[]) {
List<Dog> list = new ArrayList<>();
list.add(new Dog("Shaggy", 3));
list.add(new Dog("Lacy", 2));
list.add(new Dog("Roger", 10));
list.add(new Dog("Tommy", 4));
list.add(new Dog("Tammy", 1));
Collections.sort(list, Collections.reverseOrder());
System.out.println("按名字逆序排序:");
System.out.print(list);
}
}
输出
按名字逆序排序:
[Tommy,4, Tammy,1, Shaggy,3, Roger,10, Lacy,2]
示例
在这个示例中,我们使用 Comparable 接口根据狗的年龄来对 Dog 对象进行排序。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Dog implements Comparable<Dog> {
private String name;
private int age;
Dog() {
}
Dog(String n, int a) {
name = n;
age = a;
}
public String getDogName() {
return name;
}
public int getDogAge() {
return age;
}
public int compareTo(Dog d) {
return this.age - d.age;
}
@Override
public String toString() {
return this.name + "," + this.age;
}
}
public class ComparableDemo {
public static void main(String args[]) {
List<Dog> list = new ArrayList<>();
list.add(new Dog("Shaggy", 3));
list.add(new Dog("Lacy", 2));
list.add(new Dog("Roger", 10));
list.add(new Dog("Tommy", 4));
list.add(new Dog("Tammy", 1));
Collections.sort(list);
System.out.println("按年龄排序:");
System.out.print(list);
}
}
输出
按年龄排序:
[Tammy,1, Lacy,2, Shaggy,3, Tommy,4, Roger,10]