我有一个哈希结构hash_feat <String, List<String>>
,我的键 年,里面的值列表中有一个不同的词条列表
我已经拥有了哈希,其特定键的所有项目都位于该键的相同列表中,例如:
<1997> <A,B,C,A,A,A,B,C,C,E>
<2003> <C,C,C,A,B,A,D,D,D,A>
<2004> <A,C,C,X,X,A,K,T,T,T>
我想对每个项目进行计数。对于1997 A:4,B:2,C:3,E:1等等其他键。
我试图用这个“计数”来稍后显示在图中,我可以在图中显示每个项目的最高计数。可能这不是最聪明的方式,所以这里的任何建议都会受到欢迎。想法是让我的列表中的每个项目的数量,以便我可以在其他方法中操纵/使用。
任何人都有一个很好的建议,以聪明的方式做到这一点?
答案 0 :(得分:4)
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的提交者
答案 1 :(得分:2)
这是&#34;简单&#34; Java 8的解决方案:
import static java.util.stream.Collectors.*;
Map<String, Map<String, Long>> props =
map.entrySet().stream().collect(toMap(Map.Entry::getKey,
e -> e.getValue().stream().collect(groupingBy(String::toString, counting()))));
这将为您提供一张数字地图,以显示计数键的地图。
答案 2 :(得分:0)
希望你现在有类似的东西:
Map<String,List<String>> map = new HashMap<>();
因此,您可以遍历所有键并对每个键进行计数,如下所示:
for (List<String> values : map.values()){
System.out.println(values.size());
}
如果您需要键中每种类型的计数,则必须使用values.get()检查类型并计算每种类型。