Java 中的“IndexedSet”、“MapSet”或“SetMap”实现

Pio*_*sen 5 java collections guava

我正在寻找一个SetJava 实现,它提供基于元素属性的查找。用 Guava 术语思考,它可以使用 a Function<Element, SearchKey>(预计在所有集合元素中都是唯一的)来构造,并提供一个方法find(SearchKey key)返回一个Element函数将为其返回key

需要满足的明显假设

  • 的结果在集合中function(element)的整个生命周期中都是不变element的。
  • 函数为所有集合元素提供唯一结果

原因:
有时需要Set<Element>并且字段类型不能更改为 a Map<SearchKey, Element>(例如在 JPA 实体中或在第 4 方代码的情况下)。尽管如此,在构建这样一个对象时,人们可以安全地使用他们自己的Set具有类似Map功能的实现。

备择方案:

我已经找到了一些替代方案,但没有一个看起来是完美的

  • 没有Map类似的功能 - 使用线性搜索find(SearchKey)实现(适用于每个Set实现:)
  • 使用TreeSetComparator比较SearchKeys- 有点像hack,特别是这不再尊重元素相等性
    ,调用“find”方法ceiling并要求您Element为查找目的构建人工(uogh ...)
  • “等效集”(http://code.google.com/p/guava-libraries/issues/detail?id=576) - 但这没有实现,似乎也不会

如果你想回答你不知道更多的选择 - 节省你的时间,不要。这是我已经知道的,我将无法接受你的回答。)

maa*_*nus 2

ForwardingSet我一定错过了一些东西,否则通过到很容易HashBiMap.keySet()。我的琐碎实现只关心addaddAll,所有其他东西都应该毫不费力地工作。没有单一的测试,我建议使用 Guava testlib 来实现这一点。