oumentg 2015-10-20 04:04 采纳率: 100%
浏览 2359
已采纳

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
这是怎样实现的? 能不能把实现过程表示出来?

                                                                                           谢谢了,各位
  • 写回答

4条回答 默认 最新

  • 诸相非相 2015-10-20 05:20
    关注

    先插一句: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,建议研究一下源码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器