【问题标题】:JAVA - MultiMaps and entryset()JAVA - MultiMaps 和 entryset()
【发布时间】:2012-06-20 07:27:48
【问题描述】:

一个希望快速的问题:

我计划构建一个 MultiMap 样式结构,内部结构为 Map> 结构,并覆盖以适当方式重定向到内部地图和列表的方法(因此这对用户来说就像一个 multiMap)。当然,可能会有一些附加功能,特别是如果我要使用 Map> 或 Map> 结构的版本,我可能会在 List 版本正常工作后这样做。

我关心的是 entrySet() 和类似的方法:我如何覆盖这些以使用相同的内部数据并通过 remove 方法传播?

我怀疑这些集合是用它们的remove 函数构建的,它们重定向到map 的remove 函数,所以只要我实现了MultiMap 的remove 函数,它就会运行。谁能证实这一点?

Collections for Maps 中的一些静态函数也让我担心。 Collections 类如何生成不可修改或同步的表单,有没有办法确保我的 MultiMap 与此兼容?

【问题讨论】:

    标签: java data-structures collections map synchronization


    【解决方案1】:

    我想这取决于你将如何创建你的多重地图。

    我做了类似的事情,基本上创建了一个 MultiMap 作为 Map ,其中 Collection 是值。 通过在内部使用地图,我的 MultiMap 是一个普通的地图,所有的实用程序基本上都可以正常工作。

    public class MultiMap<K, V, T extends Collection<V>> implements Map<K, T>
    

    【讨论】:

    • 很有趣,但我希望将结构保留在内部,以使其真正表现得像 V 的 Map,除了 List getAll(Key k) 函数之外没有任何集合的可见性。通常我什至不会使用 entrySet() 函数,这是一个个人库,但我确实想正确地做到这一点,所以我不会在几年后忘记。我想我总是可以覆盖 entrySet 来抛出 UnsupportedException 或类似的,但这感觉就像在作弊。
    • 我也通过扩展 multimap 和隐藏实现来做到这一点: public class MultiListMap extends MultiMap>,然后用户可以说 MultiListMap 差异 = new MultiListMap()
    • 一个有趣的方法。今晚我会玩弄这个想法,看看会发生什么。对于任何应该返回链接到底层数据结构的集合的函数,问题仍然存在。我们如何让我们的 Multimap 返回这样一个 Set / Collection 而不返回一组 Collections 或返回一个不修改 Map 的 Set?
    • 我不确定我是否理解您所说的“链接到底层数据结构的集合”是什么意思,我包装的地图的所有值都存储为集合,所以我可以返回它并编写诸如 List valuesForKey = 差异.get(key);
    • 查看 getEntrySet() 的 API。它应该返回一个由底层集合支持的集合,这使得可以从返回的集合中删除元素并修改您的 Map
    【解决方案2】:

    您是否考虑过使用现有的 Multimap 而不是实施新的?

    例如查看Google Guava Multimap,查看Multimaps 以了解静态实用程序方法...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2017-09-28
      • 2015-09-16
      • 2012-02-16
      • 1970-01-01
      相关资源
      最近更新 更多