public class SingerComparator implements Comparator<Singer>{
@Override
public int compare(Singer singer1, Singer singer2) {
return singer1.getName().compareTo(singer2.getName());//String自身有比较需求,所以人家实现了Comparable
}
}
TreeMap是有序的,它就继承了外比较器,因为它有帮别人作比较的需求。看下源码:
// private final Comparator<? super K> comparator;
// public TreeMap(Comparator<? super K> comparator) {
// this.comparator = comparator;
// }
final int compare(Object k1, Object k2) {
return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
: comparator.compare((K)k1, (K)k2);
}
这时候你就可以这样调用啦!
TreeMap<Singer, Object> treeMap = new TreeMap<>(new SingerComparator());
这样treeMap put一个Singer,就会自己排序啦!(put方法内部会调用上面的compare方法)
不知道你注意没有,上面一段代码:(Comparable<? super K>)k1).compareTo((K)k2,意思就是说:你没有给人家TreeMap初始化Comparator,comparator==null,那你自己的Single就必须实现Comparable,这样k1、k2才可以调用compareTo方法。
如果Singer没有实现Comparable,Comparator也没有传给TreeMap。这句(Comparable<? super K>)k1强转就要报错了。
Exception in thread "main" java.lang.ClassCastException: xxxx.Singer cannot be cast to java.lang.Comparable