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;

}

}

猜你喜欢

转载自blog.csdn.net/weixin_44578470/article/details/90037148
今日推荐