如何获取 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) 为您提供 mapSortedSet 视图,其中包含大于或等于 key 的所有键。 map.tailMap(key).entrySet() 然后会得到 Set<Map.Entry> 中所有条目的 map,其键大于或等于 key。根据 javadocIteratorSet 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),而不是搜索所有键以查找每个连续更高的键。