Comparable与Comparator (1)
1. Comparator和Comparable的异同
相同点
- 两者都是接口类型,使用时均需要重写相应的方法。
不同点
- Comparable可以理解为“类有排序功能”,其接口中只有
public int compareTo(T o)
一个方法。 - Comparator是比较器,可以自由控制某个类的次序,其接口在jdk 1.8之前只有
int compare(T o1, T o2)
和boolean equals(Object obj)
这两种方法,1.8之后又增加了很多方法。
2. 代码测试
import java.util.*;
public class test {
public static void main(String[] args) {
List list1 = new ArrayList<>();
list1.add(new Student("apple", 19));
list1.add(new Student("appla", 19));
list1.add(new Student("orange", 13));
list1.add(new Student("peach", 14));
list1.add(new Student("banana", 16));
Collections.sort(list1);
System.out.println("---------按name首字母顺序输出-------------");
for (Student s : list1) {
System.out.println(s);
}
System.out.println("---------按name长短输出-------------");
List list2 = new ArrayList<>();
list2.add(new Student("ab", 13));
list2.add(new Student("abc", 14));
list2.add(new Student("abcd", 15));
list2.add(new Student("ba", 18));
// 添加重写后的 Comparator
Collections.sort(list2, new myComparator());
for (Student s : list2) {
System.out.println(s);
}
}
}
/**
* 使用 Comparable接口
* 按 name的字母排序输出
*/
class Student implements Comparable {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student s) {
return this.name.compareTo(s.name);
}
@Override
public String toString() {
return this.name + "-" + this.age + "";
}
}
/**
* 使用 Comparator接口
* 按 name的长短输出
*/
class myComparator implements Comparator {
@Override
public int compare(Student o1, Student o2) {
int num1 = o1.name.length() - o2.name.length();
// name长度一样,则按照字母排序
int num2 = o1.name.compareTo(o2.name);
return num1 == 0 ? num2 : num1;
}
}