Eclipse Collections 中有一个名为BagMultimap 的数据结构可以很好地适用于您的用例。以下是如何将 MutableBagMultimap 用于您的示例数据。
MutableBagMultimap<String, String> multimap = Multimaps.mutable.bag.empty();
multimap.putAll("1997", Lists.mutable.with("A","B","C","A","A","A","B","C","C","E"));
multimap.putAll("2003", Lists.mutable.with("C","C","C","A","B","A","D","D","D","A"));
multimap.putAll("2004", Lists.mutable.with("A","C","C","X","X","A","K","T","T","T"));
Assert.assertEquals(4, multimap.get("1997").occurrencesOf("A"));
Assert.assertEquals(2, multimap.get("1997").occurrencesOf("B"));
Assert.assertEquals(3, multimap.get("1997").occurrencesOf("C"));
Assert.assertEquals(1, multimap.get("1997").occurrencesOf("E"));
您可以简单地使用forEachKeyMultivalues 和toStringOfItemToCount 输出多图。
multimap.forEachKeyMultiValues((key, values) ->
System.out.println("<" + key + "> " + ((Bag<String>)values).toStringOfItemToCount()));
此代码显示以下内容:
<1997> {E=1, A=4, B=2, C=3}
<2004> {T=3, A=2, C=2, X=2, K=1}
<2003> {D=3, A=3, B=1, C=3}
或者您可以使用forEachWithOccurrences 编写以下代码来控制输出。
multimap.forEachKey(key -> {
System.out.print(key + " ");
multimap.get(key).forEachWithOccurrences((value, occurrences) ->
System.out.print(value + ":" + occurrences + " "));
System.out.println();
});
此代码显示以下内容:
1997 E:1 A:4 B:2 C:3
2004 T:3 A:2 C:2 X:2 K:1
2003 D:3 A:3 B:1 C:3
最后,您可以使用topOccurrences,如果您希望输出按出现次数最多到最少的顺序排列。
multimap.forEachKey(key -> {
System.out.print(key + " ");
MutableBag<String> bag = multimap.get(key);
bag.topOccurrences(bag.sizeDistinct())
.each(pair ->
System.out.print(pair.getOne() + ":" + pair.getTwo() + " "));
System.out.println();
});
此代码显示以下内容:
1997 A:4 C:3 B:2 E:1
2004 T:3 A:2 C:2 X:2 K:1
2003 D:3 A:3 C:3 B:1
注意:我是 Eclipse Collections 的提交者