是否存在NavigableMap subMap / headMap / tailMap的通用实现?

时间:2014-12-09 22:43:57

标签: java collections guava

我已经实施了NavigableMap几次,但它似乎总是比应有的更多。虽然它是一个非常大的界面,但java.util.AbstractMap和番石榴ForwardingNavigableMap之类的东西提供了很多样板。但是,似乎都没有帮助subMap / headMap / tailMap的核心实现(即除了指定包含性标志的重载之外)。例如,子/尾地图的firstEntry似乎只能调用ceilingEntry(minKey)higherEntry(minKey),具体取决于minKey是否具有包容性。番石榴或其他什么方式提供了一种简单的方法来实现这些一般吗?或者,我有理由忽视这样的实施是不切实际的吗?

4 个答案:

答案 0 :(得分:1)

Guava目前没有公开AbstractNavigableMap,但我不确定这对你有多大帮助。 TBH,我不知道它会给你多少买单:firstEntry总是可以定义为Iterables.getFirst(entrySet().iterator(), null),无论你是完整的地图还是子图或其他什么。 Guava可以可以想象提供subMap和每次通过higherEntry迭代的朋友的完整实现,但与更高效的手写迭代器实现相比,这很少是你想要的。 / p>

答案 1 :(得分:1)

我认为可以实现我正在寻找的东西,但似乎并不是现有的框架。特别是,我希望根据NavigableMapget实现remove接口,用于firstlast,{{1}的任意键和导航},next。我猜这部分原因是我代表的是外部服务交互,而不是内部数据结构。用例不太常见,性能期望也不同。

以下代码是我的草案实施。它只是经过了一些测试,旨在作为概念证明。它使用了Guava的previousIteratorsOrdering,以及来自Checker Framework的nullness注释。

ForwardingNavigableMap

答案 2 :(得分:0)

  • ForwardingNavigableMap

如果您使用NavigableMap使用decorator pattern,则必须提前ForwardingNavigableMap。所以这不是你需要的。

  • AbstractMap

AbstractMap提供Map的骨干实施。这个类可以帮助你实现一个Map,它是NavigableMap的接口,但没有'可导航的逻辑'。无论如何,NavigableMapMap,因此AbstractMap有助于设置NavigableMap。与ForwardingNavigableMap相比,我认为AbstractMap可能是您更好的选择。

答案 3 :(得分:-1)

我建议考虑更简单的事情,因为NavigableMap是一个非常丰富的界面,你最终可能会花费大量时间在你可能不需要的功能上。即使是简单的Map也有很多方法,AbstractMap几乎没有帮助,因为它只提供非常基本的实现(效率低下或抛出UnsupportedOperationException)。

如果您可以使用List(使用sublist进行"导航"),那么您可以节省很多工作。无论如何,请查看guava-testlib以获得一个好的测试套件。

如果你真的需要NavigableMap,我很害怕,你运气不好。我猜,没有合适的基类,因为不可能经常写一些有用的东西。

  

例如,看起来sub / tail映射的firstEntry可以调用ceilingEntry(minKey)或higherEntry(minKey),具体取决于minKey是否包含。

是的,但这是一个相当简单的案例。对于给定的实现,firstEntry可能有更快的方式。

相关问题