计算Hash <string,list <string>&gt;中List内项的值的出现次数

时间:2016-02-28 19:17:53

标签: java list hash hashmap counting

我有一个哈希结构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等等其他

我试图用这个“计数”来稍后显示在图中,我可以在图中显示每个项目的最高计数。可能这不是最聪明的方式,所以这里的任何建议都会受到欢迎。想法是让我的列表中的每个项目的数量,以便我可以在其他方法中操纵/使用。

任何人都有一个很好的建议,以聪明的方式做到这一点?

3 个答案:

答案 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"));

您只需使用forEachKeyMultivaluestoStringOfItemToCount即可输出多重地图。

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()检查类型并计算每种类型。