首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NavigableMap和SortedMap?

NavigableMap和SortedMap?
EN

Stack Overflow用户
提问于 2011-01-19 20:09:11
回答 6查看 17.7K关注 0票数 23

除了JVM版本之外,是否有任何理由使用SortedMap而不是NavigableMap?(NavigableMap只在1.6之后才出现;SortedMap从1.2开始就存在了)

我试图用最大的键来查找值,比如键<=引用键K0。我似乎不知道如何使用SortedMap (如果它是严格的<,那么我会调用headMap(),然后是lastKey(),然后是get()),但是NavigableMap.floorEntry()似乎正是我所需要的。

clarification:就是一个例子,我正在处理具有不同行为模型的稀疏版本号范围。键可能是0、2、5,因此版本号0和1由键#0处的值处理,版本号2-4由键#2处的值处理,版本号>= 5由键#5处的值处理。

EN

回答 6

Stack Overflow用户

发布于 2011-01-19 20:13:18

就我个人而言,我非常相信使用最不具体的界面为您提供所需的服务。这使您的意图更加清晰,并且减少了对您可能的实现的限制。

大多数开发人员都希望有排序的集合用于迭代,也许是为了随机访问性能。我很少见过我需要一个亲密元素的例子。

如果您需要这个功能,请继续。我认为TreeMap实际上实现了NavigableMap。但当你不需要它时,为什么要限制自己呢?

票数 10
EN

Stack Overflow用户

发布于 2011-01-19 20:34:10

除了JVM版本之外,是否有任何理由使用SortedMap而不是NavigableMap?

是的我能想到一个例子。映射的提供者可能已经用Collections.unmodifiableSortedMap包装了它,所以即使源是TreeMap (实现NavigableMap),您也只有对SortedMap的引用,而不能将其转换为NavigableMap

我试图用最大的键来查找值,比如键<=引用键K0。我似乎想不出如何用SortedMap来完成这个任务

有两种情况:要么映射包含与键的完全匹配,要么不包含。因此,首先寻找一个精确的匹配,只有当它不存在时,m.headMap(key).lastKey()才会给出正确的答案。

这将完成它(尽管它没有真正的NavigableMap那么高效):

代码语言:javascript
复制
static <K, V> Map.Entry<K, V> floorEntry(final SortedMap<K, V> m, K key) {
    final SortedMap<K, V> tail; 
    if (m.containsKey(key)) {
        tail = m.tailMap(key);
    } else {
        SortedMap<K, V> head = m.headMap(key);
        if (head.isEmpty()) {
            return null;
        } else {
            tail = head.tailMap(head.lastKey());
        }
    }
    return tail.entrySet()
               .iterator()
               .next();
}
票数 9
EN

Stack Overflow用户

发布于 2013-08-07 16:55:06

除了JVM版本之外,是否有任何理由使用SortedMap而不是NavigableMap?

是的,如果您需要返回不可修改的地图,并且您没有使用Google .

NavigableMap意在取代SortedMap。NavigableMap将经常需要的方法添加到SortedMap接口中,这些方法对于地图实现者来说很容易添加,但就现有的SortedMap方法而言编写起来却很麻烦。返回SortedMap而不是NavigableMap将导致代码调用者不必要的工作。

不幸的是,没有提供Collections.unmodifiableNavigableMap。IMO,这可能是一个疏忽,但在JDK1.7中没有得到纠正,所以可能有人有理由忽略它。我建议使用com.google.common.collect.Maps.unmodifiableNavigableMap

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4740167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档