如何在Guava MultiMap的值中消除重复项?

28

代码:

    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"?谢谢。

3个回答

48

使用其中一个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]}

6
根据文档,与使用 Collection 引用而非 Set、List等子接口一样,使用引用计划 Multimap 也不是首选。赋值语句左侧应为 SetMultimap。 - gk5885

14

ArrayListMultimap 这样的 ListMultimap 允许重复的键值对。尝试使用 HashMultimapTreeMultimapSetMultimap 实现。


2
@StormeHawke 我读这段代码时不需要眨眼,但看着确实很痛苦。问题是,当你在一年后回来维护这段代码时,你必须弄清楚这个特定的轮子是如何被重新发明的。它是否包含了没有值的键的空集?如果是这样,所有预期的键都有空值吗,还是只有一些?值中会有null吗?然后你开始咒骂原始作者(“该死的,过去的我!”),因为他没有使用一个具有明确定义契约和意图的集合,即multimap。 - gustafc

1

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

然而,根据您给出的示例,使用只有JDK的解决方案将简单地使用 Map<String,Set<String>>,其中将有一个唯一的键对应一个包含唯一值的Set

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

使用它的优点是您无需从外部库中引入数据结构,严格使用Java核心库。

1
很高兴看到纯Java的解决方案。 - Silviu Burcea
2
我猜所有的 Google 粉丝都不喜欢我的纯 Java 解决方案...这是我能想到的对一个完全正确的答案投反对票的唯一原因。 - StormeHawke
2
@gk5885,为什么我的示例需要填充地图?他显然已经从问题中知道如何填充地图。这将指引他朝着正确的方向前进,并给他足够的启示。 - StormeHawke
1
OP的示例表明他/她知道如何填充Multimap,而不是Map<String, Set<String>>,后者实际上需要更多的复杂性。 - Louis Wasserman
1
人口方法没有区别,如果出于某种奇怪的原因,操作员不熟悉,他可以通过大家的好朋友谷歌很容易地获得示例。 - StormeHawke
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接