Java教程-Java Comparable接口

Java Comparable接口
Java Comparable接口用于对用户自定义类的对象进行排序。该接口位于java.lang包中,只包含一个名为compareTo(Object)的方法。它仅提供单一的排序顺序,即你可以根据单个数据成员对元素进行排序,例如rollno(学号)、name(姓名)、age(年龄)或其他任何属性。
compareTo(Object obj) 方法
public int compareTo(Object obj):用于将当前对象与指定对象进行比较。它返回:
- 正整数,如果当前对象大于指定对象。
- 负整数,如果当前对象小于指定对象。
- 零,如果当前对象等于指定对象。
我们可以对以下元素进行排序:
- 字符串对象
- 包装类对象
- 用户自定义类对象
Collections类
Collections类提供了对集合元素进行排序的静态方法。如果集合元素是Set或Map类型,我们可以使用TreeSet或TreeMap进行排序。然而,我们不能对List的元素进行排序。Collections类提供了对List类型元素进行排序的方法。
对List元素进行排序的Collections类方法
public void sort(List list):用于对List的元素进行排序。List元素必须是Comparable类型。
注意:String类和包装类默认实现了Comparable接口。因此,如果在列表、集合或映射中存储的是字符串或包装类的对象,它们将默认是可比较的。
Java Comparable示例
让我们来看一个使用Comparable接口对列表元素按照年龄排序的示例。
文件:Student.java
class Student implements Comparable<Student> {
int rollno;
String name;
int age;
Student(int rollno, String name, int age) {
this.rollno = rollno;
this.name = name;
this.age = age;
}
public int compareTo(Student st) {
if (age == st.age)
return 0;
else if (age > st.age)
return 1;
else
return -1;
}
}
文件:TestSort1.java
import java.util.*;
public class TestSort1 {
public static void main(String args[]) {
ArrayList<Student> al = new ArrayList<Student>();
al.add(new Student(101, "Vijay", 23));
al.add(new Student(106, "Ajay", 27));
al.add(new Student(105, "Jai", 21));
Collections.sort(al);
for (Student st : al) {
System.out.println(st.rollno + " " + st.name + " " + st.age);
}
}
}
输出结果:
105 Jai 21
101 Vijay 23
106 Ajay 27
Java Comparable示例:逆序排序
让我们看一个使用Comparable接口将列表元素按年龄逆序排序的示例。
文件:Student.java
class Student implements Comparable<Student> {
int rollno;
String name;
int age;
Student(int rollno, String name, int age) {
this.rollno = rollno;
this.name = name;
this.age = age;
}
public int compareTo(Student st) {
if (age == st.age)
return 0;
else if (age < st.age)
return 1;
else
return -1;
}
}
文件:TestSort2.java
import java.util.*;
public class TestSort2 {
public static void main(String args[]) {
ArrayList<Student> al = new ArrayList<Student>();
al.add(new Student(101, "Vijay", 23));
al.add(new Student(106, "Ajay", 27));
al.add(new Student(105, "Jai", 21));
Collections.sort(al);
for (Student st : al) {
System.out.println(st.rollno + " " + st.name + " " + st.age);
}
}
}
输出结果:
106 Ajay 27
101 Vijay 23
105 Jai 21