来自List <List <String >>的频率计数的唯一值

时间:2019-10-12 22:13:25

标签: java list data-structures hashmap

我试图计算List<List<String>>中每个元素的出现次数,并将结果存储在Map<String,Long>中。

Map<String, Long> map = new HashMap<>();    
for(List<String> l : data) {
        for(int i = 0; i < l.size(); i++) {
            String myString = l.get(i);
            long count = data.stream().filter(d -> myString.equals(d)).count();
            map.put(myString, count);
        }
    }

我的代码为每个键返回零作为值。有办法解决吗?谢谢。

2 个答案:

答案 0 :(得分:4)

尝试一下:

List<List<String>> listOflists  = new ArrayList<>();
//Initialize your list here
Map<String, Long> map = listOflists.stream().flatMap(Collection::stream)
                    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

答案 1 :(得分:3)

您正在流式传输data,它是List<List<String>>。这意味着流的每个元素都具有类型List<String>。然后,在filter的lambda中,您尝试查看myString(类型String)是否等于d(类型List<String>)。对于所有元素,使count等于0永远都是不正确的。

您需要做的是在data.stream()返回的流上调用flatMap,函数参数为List::stream(或Collection::stream)。这样做是将List<String>的流转换为String的流,然后可以在其上调用filter方法。