我已经实施了NavigableMap
几次,但它似乎总是比应有的更多。虽然它是一个非常大的界面,但java.util.AbstractMap
和番石榴ForwardingNavigableMap
之类的东西提供了很多样板。但是,似乎都没有帮助subMap
/ headMap
/ tailMap
的核心实现(即除了指定包含性标志的重载之外)。例如,子/尾地图的firstEntry
似乎只能调用ceilingEntry(minKey)
或higherEntry(minKey)
,具体取决于minKey
是否具有包容性。番石榴或其他什么方式提供了一种简单的方法来实现这些一般吗?或者,我有理由忽视这样的实施是不切实际的吗?
答案 0 :(得分:1)
Guava目前没有公开AbstractNavigableMap
,但我不确定这对你有多大帮助。 TBH,我不知道它会给你多少买单:firstEntry
总是可以定义为Iterables.getFirst(entrySet().iterator(), null)
,无论你是完整的地图还是子图或其他什么。 Guava可以可以想象提供subMap
和每次通过higherEntry
迭代的朋友的完整实现,但与更高效的手写迭代器实现相比,这很少是你想要的。 / p>
答案 1 :(得分:1)
我认为可以实现我正在寻找的东西,但似乎并不是现有的框架。特别是,我希望根据NavigableMap
和get
实现remove
接口,用于first
,last
,{{1}的任意键和导航},next
。我猜这部分原因是我代表的是外部服务交互,而不是内部数据结构。用例不太常见,性能期望也不同。
以下代码是我的草案实施。它只是经过了一些测试,旨在作为概念证明。它使用了Guava的previous
,Iterators
和Ordering
,以及来自Checker Framework的nullness注释。
ForwardingNavigableMap
答案 2 :(得分:0)
如果您使用NavigableMap
使用decorator pattern,则必须提前ForwardingNavigableMap
。所以这不是你需要的。
AbstractMap
提供Map
的骨干实施。这个类可以帮助你实现一个Map
,它是NavigableMap
的接口,但没有'可导航的逻辑'。无论如何,NavigableMap
是Map
,因此AbstractMap
有助于设置NavigableMap
。与ForwardingNavigableMap
相比,我认为AbstractMap
可能是您更好的选择。
答案 3 :(得分:-1)
我建议考虑更简单的事情,因为NavigableMap
是一个非常丰富的界面,你最终可能会花费大量时间在你可能不需要的功能上。即使是简单的Map
也有很多方法,AbstractMap
几乎没有帮助,因为它只提供非常基本的实现(效率低下或抛出UnsupportedOperationException
)。
如果您可以使用List
(使用sublist
进行"导航"),那么您可以节省很多工作。无论如何,请查看guava-testlib以获得一个好的测试套件。
如果你真的需要NavigableMap
,我很害怕,你运气不好。我猜,没有合适的基类,因为不可能经常写一些有用的东西。
例如,看起来sub / tail映射的firstEntry可以调用ceilingEntry(minKey)或higherEntry(minKey),具体取决于minKey是否包含。
是的,但这是一个相当简单的案例。对于给定的实现,firstEntry
可能有更快的方式。