【问题标题】:How to eliminate duplicates in Guava MultiMap values?如何消除 Guava MultiMap 值中的重复项?
【发布时间】:2013-09-29 18:41:09
【问题描述】:

代码:

    Multimap<String, String> myMultimap = ArrayListMultimap.create();
    myMultimap.put("12345", "qwer");
    myMultimap.put("12345", "abcd");
    myMultimap.put("12345", "qwer");
    System.out.println(myMultimap);

结果:

{12345=[qwer, abcd, qwer]}

是否可以消除重复的“qwer”? 谢谢。

【问题讨论】:

    标签: java collections guava multimap


    【解决方案1】:

    使用SetMultimap 实现之一,例如HashMultimap

    SetMultimap<String, String> myMultimap = HashMultimap.create();
    myMultimap.put("12345", "qwer");
    myMultimap.put("12345", "abcd");
    myMultimap.put("12345", "qwer");
    System.out.println(myMultimap); // {12345=[abcd, qwer]}
    

    【讨论】:

    • 正如文档所述,对计划 Multimap 的引用很少优于其中一个子接口,原因与对 Collection 的引用很少优于 Set、List 等的原因相同。分配的 LHS应该是一个 SetMultimap。
    【解决方案2】:

    ListMultimapArrayListMultimap 允许重复的键值对。尝试实现SetMultimap,例如HashMultimapTreeMultimap

    【讨论】:

    • @StormeHawke 我在阅读时不必眨眼,但看着确实很痛。问题是,当你一年后回来维护这段代码时,你必须弄清楚这个特殊的轮子是如何被重新发明的。它会包含没有值的键的空集吗?如果是这样,是否有 all 预期键的空值,或者只是一些?值之间会有空值吗?然后你开始诅咒原作者(“该死的你,超越我!”)没有使用具有明确定义的合同和意图的集合,即多地图。
    【解决方案3】:

    有很多方法可以做到这一点。最简单的方法是使用SetMultimap

    但是,对于您给定的示例,仅 JDK 的解决方案是简单地使用 Map&lt;String, Set&lt;String&gt;&gt;,这将有一个唯一键指向唯一值的 Set

    Map<String, Set<String>> map = new HashMap<String, Set<String>>();
    

    使用它的好处是您不必从外部库中引入数据结构,而是严格使用 java 核心库。

    【讨论】:

    • 很高兴看到纯 Java 解决方案。
    • 我猜所有的谷歌追星族都不喜欢我的纯 Java 解决方案......唯一的原因是我可以看到对一个完全有效的答案投反对票
    • @gk5885 为什么我的示例需要填充地图?仅仅通过阅读他的问题,他就已经清楚地知道如何填充地图。这为他指明了正确的方向,并为他提供了充足的空间。
    • OP 的示例表明他/她知道如何填充 Multimap,而不是 Map&lt;String, Set&lt;String&gt;&gt;,事实上,这需要更多的复杂性。
    • 人口方法没有区别,如果因为一些奇怪的原因,OP不熟悉,他可以很容易地通过大家的好朋友谷歌得到例子
    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多