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

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条)

相关推荐 更多相似问题