Java treemap集合类,自定义比较器怎样实现逆字典顺序输出的?

Java treemap集合类,自定义比较器怎样实现逆字典顺序输出的?

问题描述:

代码是:
import java.util.*;
public class Example21 { // 创建TreeMap测试类
public static void main(String[] args) {
TreeMap tm = new TreeMap(new MyComparator());// 传入一个自定义比较器
tm.put("1", "Jack"); // 向集合存入学生的学号和姓名
tm.put("2", "Rose");
tm.put("3", "Lucy");
Set keySet = tm.keySet(); // 获取键的集合
Iterator it = keySet.iterator(); // 获得迭代器对象
while (it.hasNext()) {
Object key = it.next(); // 获得一个键
Object value = tm.get(key); // 获得键对应的值
System.out.println(key + ":" + value);
}
}
}
class MyComparator implements Comparator { // 自定义比较器
public int compare(Object obj1, Object obj2) {// 实现比较方法
String id1 = (String) obj1; // 将Object类型的参数强转为String类型
String id2 = (String) obj2;

return id2.compareTo(id1); // 将比较之后的值返回
}
}

输出结果是:
3:Lucy
2: Rose
1:Jack
当我把 return id2.compareTo(id1); 改成 return id1.compareTo(id2); 时
输出结果是这样的:1:Jack
2:Rose
3:Lucy
这是怎样实现的? 能不能把实现过程表示出来?

                                                                                           谢谢了,各位

先插一句:TreeMap核心数据结构是红黑树,一种平衡二叉树,所以TreeMap在查找和排序都是基于红黑树的。
TreeMap会根据key值进行排序保存,因为要排序就需要能比较大小,所以一般来说put到TreeMap中的key都应该是Comparable的子类;
如果是通过Tree传入自定义的比较器,那么排序结果由自定义的比较器比较结果确定,

 compare(Object obj1, Object obj2)
上面返回值小于等于0,认为obj1 要排到obj2前,否则obj1 要排到obj2后

(注:在二叉平衡树中,所谓的排前排后,就是在当前树节点的左侧还是在右侧,在不涉及到数的排序算法情况下,这里简单说前后了)
当把 return id2.compareTo(id1); 改成 return id1.compareTo(id2); 时,TreeMap就被"骗"了,根据比较结果判断得出了跟实际正好相反的结果,误导了排序结果。
下面是TreeMap比较元素的方面,可以参考:

  /**
   * Compares two keys using the correct comparison method for this TreeMap.
   */
  final int compare(Object k1, Object k2) {
     return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
        : comparator.compare((K)k1, (K)k2);
 }

更详细了解TreeMap,建议研究一下源码。

class MyComparator implements Comparator { // 自定义比较器
public int compare(Object obj1, Object obj2) {// 实现比较方法
String id1 = (String) obj1; // 将Object类型的参数强转为String类型
String id2 = (String) obj2;

return id2.compareTo(id1); // 将比较之后的值返回
}
这里返回改成即可
return id1.compareTo(id2); // 将比较之后的值返回

-同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

把比较函数里的比较规则转换一下就行了