除了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处的值处理。
发布于 2011-01-19 20:13:18
就我个人而言,我非常相信使用最不具体的界面为您提供所需的服务。这使您的意图更加清晰,并且减少了对您可能的实现的限制。
大多数开发人员都希望有排序的集合用于迭代,也许是为了随机访问性能。我很少见过我需要一个亲密元素的例子。
如果您需要这个功能,请继续。我认为TreeMap实际上实现了NavigableMap。但当你不需要它时,为什么要限制自己呢?
发布于 2011-01-19 20:34:10
除了JVM版本之外,是否有任何理由使用SortedMap而不是NavigableMap?
是的我能想到一个例子。映射的提供者可能已经用Collections.unmodifiableSortedMap包装了它,所以即使源是TreeMap (实现NavigableMap),您也只有对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();
}发布于 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。
https://stackoverflow.com/questions/4740167
复制相似问题