【问题标题】:Unique values with frequency count from List<List<String>>List<List<String>> 中具有频率计数的唯一值
【发布时间】:2020-02-10 00:42:29
【问题描述】:

我正在尝试计算List&lt;List&lt;String&gt;&gt; 中每个元素的出现次数,并将结果存储在Map&lt;String,Long&gt; 中。

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);
        }
    }

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

【问题讨论】:

  • 提示:字符串永远不会等于列表。其他提示:Stream 有 flatMap 方法,Collectors 有 toMap() 方法。
  • groupingBy 是另一个(更好的)选项,顺便说一句。

标签: java list data-structures hashmap


【解决方案1】:

您正在直播data,即List&lt;List&lt;String&gt;&gt;。这意味着流的每个元素都具有List&lt;String&gt; 类型。然后,在 filter 的 lambda 中,您试图查看 myStringString 类型)是否等于 dList&lt;String&gt; 类型)。这永远不会是真的,使所有元素的 count 等于 0。

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

【讨论】:

    【解决方案2】:

    试试这个:

    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()));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-03
      • 2016-06-11
      • 1970-01-01
      • 2018-11-10
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多