在Java中,若想实现自定义类的比较(目的是给对象排序),提供了以下两个接口,
1.Comparable接口(内部比较器):
- ①若一个类实现了Comparable接口,就意味着该类支持排序。存放该类的Collection或数组,可以直接通过
Collection.sort()
或Arrays.sort()
进行排序。 - ②实现了Comparable接口的类可以直接存放在TreeSet或TreeMap中。Comparable接口只有一个函数:
public int compare To(T o)
;返回值三种情况:
返回正数:表示当前对象大于目标对象
返回0:表示当前对象等于目标对象
返回负数:表示当前对象小于目标对象
2.Comparator(外部排序接口):
前提:
若要控制某个自定义类的顺序,而该类本身不支持排序(类本身没有实现Comparable接口)。我们可以建立一个该类的“比较器”来进行排序。比较器实现Comparator接口即可。
名词解释:
“比较器”: 实现了Comparator接口的类作为比较器,通过该比较器来进行类的排序。
原理:
Comparator接口包含两个方法,compare()
和equals()
。其中compare()
方法用来给两个输入参数排序;equals()
方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。
Int compare(T o1, T o2)
;返回值:
返回正数: o1>o2
返回0: o1=o2
返回负数: o1<o2
Comparable接口与Comparator接口关系:
Comparable是排序接口,若一个类实现了Comparable接口,意味着该类支持排序,是一个内部比较器(自己去和别人比,亲历亲为)。
Comparator接口是比较器接口,类本身不支持排序,专门有若干个第三方的比较器(实现了Comparator接口的类)来进行类的排序,是一个外部比较器(策略模式,类比安兔兔)。
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
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;
}
}
class AcsAgeComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
}
public class Test {
public static void main(String[] args) {
Set<Person> set = new TreeSet<Person>(new AcsAgeComparator());
set.add(new Person("张三",20));
set.add(new Person("李四",18));
set.add(new Person("王五",19));
System.out.println(set);
}
}
默认从小到大排序。