NavigableMap vs. SortedMap?

2022-09-01 23:26:25

除了JVM版本之外,还有什么理由使用SortedMap而不是NavigableMap?(自1.6以来一直存在; 自1.2以来一直存在)NavigableMapSortedMap

我试图找到具有最大键的值,使得键<=引用键K0。我似乎不知道如何用a来做到这一点(如果它被严格<,那么我会打电话,然后然后),但NavigableMap.floorEntry()似乎正是我需要的。SortedMapheadMap()lastKey()get()


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


答案 1

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

大多数开发人员希望排序集合用于迭代目的,也许还可以用于随机访问性能。我见过很少需要紧密元素的情况。

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


答案 2

除了JVM版本之外,还有什么理由使用SortedMap而不是NavigableMap?

是的,我可以举一个例子。映射的提供者可能已用 包装它,因此即使源是 a(实现),您也只有对 a 的引用,并且不能将其转换为 。Collections.unmodifiableSortedMapTreeMapNavigableMapSortedMapNavigableMap

我试图找到具有最大键的值,使得键<=引用键K0。我似乎无法弄清楚如何使用排序地图来做到这一点

好吧,有两种情况:地图要么包含与密钥完全匹配,要么不包含密钥。因此,首先要寻找完全匹配,只有当它不存在时,才会给出正确的答案。m.headMap(key).lastKey()


这将做到这一点(尽管它不如真实有效):NavigableMap

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();
}

推荐