Jas*_*n S 21 java sorting dictionary
除了JVM版本之外,有没有理由使用SortedMap而不是NavigableMap?(NavigableMap自1.6 SortedMap以来一直存在; 自1.2以来一直存在)
我试图找到具有最大键的值,使得键<=引用键K0.我似乎无法弄清楚如何使用a SortedMap(如果它严格<,然后我会打电话headMap()然后lastKey()然后get()),但NavigableMap.floorEntry()似乎正是我需要的.
澄清:作为一个例子,我正在处理具有不同行为模型的稀疏版本号范围.键可能是[0,2,5],因此版本号0和1由键#0处的值处理,版本号2-4由键#2处的值处理,版本号> = 5由#5号键的值处理.
就个人而言,我非常相信使用最不具体的界面可以满足您的需求.这使您的意图更加清晰,并且对您的可能实现的限制更少.
大多数开发人员希望Sorted集合用于迭代目的,也许还需要随机访问性能.我看到很少有需要关闭元素的情况.
如果您需要该功能,请继续.我认为TreeMap实际上实现了NavigableMap.但是当你不需要它时,为什么限制自己呢?
除了JVM版本之外,有没有理由使用SortedMap而不是NavigableMap?
是的,我可以想到一个例子.地图的提供者可能已将其包装Collections.unmodifiableSortedMap,因此即使源是TreeMap(实现NavigableMap),您只能引用a SortedMap而无法将其转换为NavigableMap.
我试图找到具有最大键的值,使得键<=引用键K0.我似乎无法弄清楚如何使用SortedMap做到这一点
有两种情况:地图包含密钥的完全匹配,或者没有.因此,首先寻找完全匹配,只有当它不存在时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();
}
除了 JVM 版本之外,
SortedMap还有什么理由使用, 来代替 吗?NavigableMap
是的,如果您需要在 Java 7 或更早版本上返回不可修改的地图,并且您没有使用 Google Guava。
NavigableMap旨在取代SortedMap.  NavigableMap向SortedMap接口添加经常需要的方法,对于Map实现者来说很容易添加,但根据现有SortedMap方法编写却很困难。返回SortedMap而不是NavigableMap会导致代码的调用者进行不必要的工作。
不幸的是Collections.unmodifiableNavigableMap没有提供。IMO 这可能是一个疏忽,但它在 JDK 1.7 中没有得到纠正,所以也许有人有理由忽略它。然而,它是在 Java 8 中添加的。我建议使用com.google.common.collect.Maps.unmodifiableNavigableMap.
| 归档时间: | 
 | 
| 查看次数: | 14881 次 | 
| 最近记录: |