Java Comparator接口
---------------------------------------------------------------------
开发工具和关键技术: MyEclipse 10 和 java
撰写时间: 20190503
---------------------------------------------------------------------
Comparator可以比较的对象类型,是比较接口。我们如果需要控制某个类的次序,而该类本身不支持排
序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排
序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现
Comparator来新建一个比较器,然后通过这个比较器对类进行排序。
要注意的是:
若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
int compare(T o1, T o2) 是“比较o1和o2的大小”,其中o1指的就是第一个要比较的对象, o2指的就是第二要比的对象。 比较之后会根据大小返回值。 返回“负数”, 意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2。
不重写 Object.equals(Object) 方法总是安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。
这个接口有两个方法:
Compare :比较用啦排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数,零,或正整数。
Equals : 指示某个其他对象是否“等于”此Comparator。此方法必须遵守Object.equals(Object)的常规协定。此外,仅当指定的对象于是一个Comparator,并且强行实施于此Comparator相同的排序时,此方法才返回true。因此,compl.equals(comp2)意味着对每个对象引用o1和o2而言,都存在sgn(compl.compare(o1,o2)) == sgn(somp2.compare(o1,o2))。
用Comparable简单, 只要实现Comparable 接口的对象直接就成为一个可以比较
的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另
外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传
递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用
的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
示例代码 :
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ListComparatorDemo {
public static void main(String[] args) {
//定义一个list集合,用来存放对象,可以这样写:Collections.sort(list,new 实现类())
List<PersonComparator> list= new ArrayList<PersonComparator>();
list.add(new PersonComparator("小A", 23));
list.add(new PersonComparator("小H", 21));
list.add(new PersonComparator("小G", 13));
list.add(new PersonComparator("小E", 24));
list.add(new PersonComparator("小W", 43));
list.add(new PersonComparator("小D", 25));
//调用Collecttions.sort排序方法
Collections.sort(list, new Comparator<PersonComparator>() {
//复写Comparator的compara接口
@Override
public int compare(PersonComparator o1, PersonComparator o2) {
if (o1.getAge()== o2.getAge()) {
//名字按照拼音字母先後顺序(小到大)是o1.getName().compareTo(o2.getName)
return o1.getName().compareTo(o2.getName());
}
else{
//从小到大排序 o1 - o2
//从大到小排序 o2 - o1
return o1.getAge() - o2.getAge();
}
}
});
//遍历
for (PersonComparator person : list) {
System.out.println(person.getName() + " " + person.getAge());
}
}
}
//创建一个类
class PersonComparator {
//声明成员变量
private String name;
private int age;
//声明构造器
public PersonComparator(String name, int age) {
super();
this.name = name;
this.age = age;
}
//创建getter 和 setter 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}