最近在看TreeMap的源码,发现了有一个构造方法里面有个参数Comparator,发现是一个接口,用于比较对象大小的比较器,在类外部使用,与Comparable接口相对应,Comparable接口在类内部使用,类直接实现该接口。
Java已经给我们提供了很多用Comparable接口或Comparator接口的实现来排序的容器,比如最常用的数组,以及TreeMap等。
我们以数组排序为例,来看看比较器的实现和作用。
package wangcc.com;
public class Player implements Comparable<Player> {
private String name;
private int age;
private int point;
private int assist;
public Player(String name, int age, int point, int assist) {
this.name = name;
this.age = age;
this.point = point;
this.assist = assist;
}
@Override
public String toString() {
return "Player [name=" + name + ", age=" + age + ", point=" + point
+ ", assist=" + assist + "]";
}
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;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
public int getAssist() {
return assist;
}
public void setAssist(int assist) {
this.assist = assist;
}
@Override
public int compareTo(Player o) {
// TODO Auto-generated method stub
if (this.age > o.age) {
return 1;
} else if (this.age < o.age) {
return -1;
}
if (this.point > o.point) {
return 1;
} else if (this.point < o.point) {
return -1;
}
return 0;
}
}
package wangcc.com;
import java.util.Comparator;
public class PlayerComparator implements Comparator<Player> {
@Override
public int compare(Player o1, Player o2) {
// TODO Auto-generated method stub
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o1.getAge() < o2.getAge()) {
return -1;
}
if (o1.getPoint() > o2.getPoint()) {
return 1;
} else if (o1.getPoint() < o2.getPoint()) {
return -1;
}
return 0;
}
}
package wangcc.com;
import java.util.Arrays;
import java.util.Comparator;
import org.junit.Test;
public class TestComp {
@Test
public void testComparable() {
Player[] array = { new Player("kobe", 39, 25, 5),
new Player("james", 33, 28, 8), new Player("paul", 33, 20, 4),
new Player("durant", 29, 35, 5) };
Arrays.sort(array);
for (Player player : array) {
System.out.println(player.toString());
}
}
@Test
public void testComparator() {
Player[] array = { new Player("kobe", 39, 25, 5),
new Player("james", 33, 28, 8), new Player("paul", 33, 20, 4),
new Player("durant", 29, 35, 5) };
Comparator<Player> comp = new PlayerComparator();
Arrays.sort(array, comp);
for (Player player : array) {
System.out.println(player.toString());
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}