如何获取 TreeMap 中的上一个和下一个条目
How to get previous and next entries in TreeMap
我有一个排序的地图,我正在寻找需要找到一些键的最近的 'before' 和 'after' 条目,这些条目完全满足某些条件。
Entry findAfter(TreeMap map, Key key, Predicate p) {
Entry e = map.higherEntry(key);
while (e!=null && !p.test(e.getValue())
e = map.higherEntry(e.getKey());
return e;
}
这似乎效率不高,因为 O(logN) 中的更高条目。有没有更好的方法?
我希望 TreeMap 有 map.nextEntry(e) 可以在 O(1) 中运行,但据我所知,没有。
检查一下:map.tailMap(key)
为您提供 map
的 SortedSet
视图,其中包含大于或等于 key
的所有键。 map.tailMap(key).entrySet()
然后会得到 Set<Map.Entry>
中所有条目的 map
,其键大于或等于 key
。根据 javadoc,Iterator
在 Set
returns 之上,条目按升序排列。
所以也许这样的事情对你有用:
Entry findAfter(TreeMap map, Key key, Predicate p) {
for (Entry e : map.tailMap().entrySet()) {
if (p.test(e.getValue() &&
!e.getKey().equals(key))
return e;
}
return null;
}
键子集上的迭代器必须更接近 O(1),而不是搜索所有键以查找每个连续更高的键。
我有一个排序的地图,我正在寻找需要找到一些键的最近的 'before' 和 'after' 条目,这些条目完全满足某些条件。
Entry findAfter(TreeMap map, Key key, Predicate p) {
Entry e = map.higherEntry(key);
while (e!=null && !p.test(e.getValue())
e = map.higherEntry(e.getKey());
return e;
}
这似乎效率不高,因为 O(logN) 中的更高条目。有没有更好的方法?
我希望 TreeMap 有 map.nextEntry(e) 可以在 O(1) 中运行,但据我所知,没有。
检查一下:map.tailMap(key)
为您提供 map
的 SortedSet
视图,其中包含大于或等于 key
的所有键。 map.tailMap(key).entrySet()
然后会得到 Set<Map.Entry>
中所有条目的 map
,其键大于或等于 key
。根据 javadoc,Iterator
在 Set
returns 之上,条目按升序排列。
所以也许这样的事情对你有用:
Entry findAfter(TreeMap map, Key key, Predicate p) {
for (Entry e : map.tailMap().entrySet()) {
if (p.test(e.getValue() &&
!e.getKey().equals(key))
return e;
}
return null;
}
键子集上的迭代器必须更接近 O(1),而不是搜索所有键以查找每个连续更高的键。