1.Comparable接口
若一个类实现了Comparable接口,就意味着“该类支持排序”。
实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素, 而不需要指定比较器。
Comparable 定义
Comparable 接口仅仅只包括一个函数,它的定义如下:
public interface Comparable<T> {
public int compareTo(T o);
}
关于返回值:
可以看出compareTo方法返回一个int值,该值有三种返回值:
- 返回负数:表示当前对象小于比较对象
- 返回0:表示当前对象等于目标对象
- . 返回正数:表示当前对象大于目标对象
2.Comparator接口
Comparator 是比较器接口。
若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,可以建立一个“该类的比较器”来进行排序。
这个“比较器”只需要实现Comparator接口即可。
也就是说,可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
Comparator 定义
Comparator 接口仅仅只包括两个个函数,它的定义如下:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
int compare(T o1, T o2) 是“比较o1和o2的大小”。
- 返回“负数”,意味着“o1比o2小”;
- 返回“零”,意味着“o1等于o2”;
- 返回“正数”,意味着“o1大于o2”。
Comparator 和 Comparable 比较:
Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。 而Comparator是比较器;若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
eg:使用Comparator接口
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
/**
* @author: ChangYajie
* @date: 2019/7/28
*/
class Person{
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
static class AscAgeComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}
static class DescAgeComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o2.getAge() - o1.getAge();
}
}
}
public class TeatDemo1 {
public static void main(String[] args) {
Set<Person> set = new TreeSet<>(new Person.AscAgeComparator());
set.add(new Person("zs",20));
set.add(new Person("ls",21));
set.add(new Person("ww",22));
System.out.println(set);
Set<Person> set1 = new TreeSet<>(new Person.DescAgeComparator());
set.add(new Person("zs",20));
set.add(new Person("ls",21));
set.add(new Person("ww",22));
System.out.println(set1);
}
}