Comparable
java.lang.Comparable接口的定义,源码如下:
public interface Comparable<T> {
public int compareTo(T o);
}
如果一个类实现了Comparable接口,就可以按照自己制定的规则将由它创建的对象进行比较.下面给出一个例子:
public class Cmower implements Comparable<Cmower> {
private int age;
private String name;
public Cmower(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Cmower o) {
return this.getAge() - o.getAge();
}
public static void main(String[] args) {
Cmower wanger = new Cmower(19,"王二");
Cmower wangsan = new Cmower(16,"王三");
if (wanger.compareTo(wangsan) < 0) {
System.out.println(wanger.getName() + "比较年轻有为");
} else {
System.out.println(wangsan.getName() + "比较年轻有为");
}
}
}
在上面的示例中,我创建了一个Cmower类,它由两个字段:age和name。Cmower类实现了Comparable接口,并重写了compareTo()方法。该方法的返回值可能为负数,零或者正数,代表的意思是该对象排序的规则小于,等于或者大于要比较的对象。
2.Comparator
java.util.Comparator的接口定义相比Comparable复杂点,不过核心方法就只有两个,
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
第一个方法compare(T o1,T o2)的返回值可能为负数,零或者正数,代表意思是第一个对象小于,等于或者大于第二个对象。
第二个方法equals(Object obj)需要传入一个Object作为参数,并判断改Object是否和Comparator保持一致。
有时候,我们想让类保持它的原貌,不想主动实现Comparable接口,但我们又需要它们之间进行比较,该怎么办?
Comparator就派上用场了。
public class Cmower {
private int age;
private String name;
public Cmower(int age, String name) {
this.age = age;
this.name = name;
}
}
Cmower类有两个字段:age和name,意味着该类可以安装age或者name进行排序。
再来看Comparator接口的实现类:
public class CmowerComparator implements Comparator<Cmower> {
@Override
public int compare(Cmower o1, Cmower o2) {
return o1.getAge() - o2.getAge();
}
}
测试类:
Cmower wanger = new Cmower(19,"王二");
Cmower wangsan = new Cmower(16,"王三");
Cmower wangyi = new Cmower(28,"王一");
List<Cmower> list = new ArrayList<>();
list.add(wanger);
list.add(wangsan);
list.add(wangyi);
list.sort(new CmowerComparator());
for (Cmower c : list) {
System.out.println(c.getName());
}
我们来看下输出的结果:
王三
王二
王一
这意味着王三的年纪比王二小,排第一位;王一的年纪比王二大,排第三位。
3.到底该用哪一个呢?
- 一个类实现了 Comparable 接口,意味着该类的对象可以直接进行比较(排序),但比较(排序)的方式只有一种,很单一。
- 一个类如果想要保持原样,又需要进行不同方式的比较(排序),就可以定制比较器(实现 Comparator 接口)
举个不恰当的例子。我想从上海出发去北京看长城,要么坐飞机,要么坐高铁;但如果是孙悟空的话,翻个筋斗就到了。我和孙悟空之间有什么区别呢?孙悟空自己实现了 Comparable 接口(他那年代也没有飞机和高铁,没得选),而我可以借助 Comparator 接口(现代化的交通工具)。
总而言之,如果对象的排序需要基于自然顺序,请选择 Comparable,如果需要按照对象的不同属性进行排序,请选择 Comparator。
网友评论