请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于treeMap不能根据value排序的原因

今天面试官问我treeMap是根据什么来排序,我答的是能根据key和value综合排序,后来从网上一搜发现只能根据key排序。

想知道为什么不能根据value排序呢,我想的是因为treeMap本质上是一个查找树,我们可以实现comparator接口,然后在compare中综合比较key和value,然后建树,增加树节点,删除节点,都按compare中的逻辑来判断大小,这样就保证逻辑是一致的,然后就可以实现综合排序了,如果要修改树节点可以,先删除节点,再添加节点。

总的来说,我的想法就是只要保证排序逻辑前后一致,根据key和value综合排序是可以的,因为建的树是合理的,我这样想有什么问题么?

正在回答

1回答

同学好,

TreeMap 默认排序规则:按照key的字典顺序来排序(升序),主要是因为我们通常的用法习惯都是按照某类线索来排序,线索通常跟key相关。

当然,也可以自定义排序规则:要实现Comparator接口。

所以同学的理解是正确的

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_君君晨晨_0 #1
    我好像知道为什么TreeMap不能根据value排序了,我看了下TreeMap源码,它的put函数是如下这样写的,它传入的比较函数的值是key,而不是Entry<K,V>,所以即使实现了Comparator,也只能比较对key的排序做自定义,要想对value做排序要采取别的方法。
    
     Comparator<? super K> cpr = comparator;
            if (cpr != null) {
                do {
                    parent = t;
                    cmp = cpr.compare(key, t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);
                } while (t != null);
            }
    回复 有任何疑惑可以回复我~ 2020-09-24 08:42:47
  • 翔仔 回复 提问者 qq_君君晨晨_0 #2
    赞同学分析问题的能力,确实是这样的,但是也可以通过转换成其他的map,然后实现比较器进行排序,treemap本身是一棵红黑树,要保证它的key是满足红黑树规则,所以我仔细看了下,如果不改变类型,确实没办法按照value来排序,感谢同学的分享
    回复 有任何疑惑可以回复我~ 2020-09-25 00:12:58
  • 提问者 qq_君君晨晨_0 #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-09-25 07:57:07
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信