当前位置: 首页 > 知识库问答 >
问题:

Java 8中使用Lambdas的计数频率(专用)

朱啸
2023-03-14

我有这样一个字符串列表:“na”,“na”,“na”,“uk”,“uk”。我想计算每个元素的频率,如果现有贴图的值为偶数,那么我将添加1;否则2。

 List<String> streamer=Arrays.asList("na","na","na","uk","uk");
        Map<String,Integer> m=new HashMap<>();
        for(String s:streamer)
        {
            if(m.containsKey(s))
            {
                if(m.get(s)%2==0)
                    m.put(s,m.get(s)+1);
                else
                    m.put(s,m.get(s)+2);
            }
            else
                m.put(s,1);
        }
        System.out.println("CUSTOM Frequency::::"+m); 

现在,我想使用stream和lambdas来实现完全相同的事情。我所能做的就是:

Map<String, Long>map4 = streamer.stream()
                .collect(Collectors.groupingBy(Function.identity(),
                        Collectors.counting())); //How can I get custom counting instead of Collectors.counting()?

共有2个答案

陈富
2023-03-14

除了@Sweeper的答案以获得预期的计数结果外,如果您的问题还暗示了如何自定义收集操作,您可以使用Collector类的()方法

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Collector.html#of(java.util.function.Supplier、java.util.function.BiConsumer、java.util.function.BinaryOperator、java.util.stream.Collector.Characteristics…)

该方法接受供应商、作为双消费者的累加器和作为二进制运算符的组合器。供应商只需提供存储结果的容器,在您的示例中是一个映射

List<String> streamer = Arrays.asList("na", "na", "na", "uk", "uk");
Map<String, Long> map4 = streamer.stream()
        .collect(Collector.of(
                HashMap::new,
                (Map<String, Long> map, String s) -> {
                    if (!map.containsKey(s)) {
                        map.put(s, 1L);
                    } else {
                        map.computeIfPresent(s, (String key, Long val) -> val % 2 != 0 ? val + 2 : val + 1);
                    }
                },
                (Map<String, Long> map1, Map<String, Long> map2) -> {
                    map1.putAll(map2);
                    return map1;
                }
        ));
{na=5, uk=3}

司马宏邈
2023-03-14

请注意,您的自定义计数方式总是导致计数比正常计数结果少一倍。你基本上把每件事都算为2件事,除了第一件事。唯一的边缘情况是0,其中两种计数方法产生相同的结果,但如果它是0,则无论如何都不会将其放入地图中,因此我们实际上不需要处理它。

我们可以从收集器中计算出所需的结果。counting()使用收集器,然后使用收集器:

var frequency = streamer.stream().collect(Collectors.groupingBy(Function.identity(),
    Collectors.collectingAndThen(Collectors.counting(),
        normalCount -> normalCount * 2 - 1)
    ));
 类似资料:
  • 给定 我想使用Java8流像下面这样打印 。 使用以下内容: 但不起作用。

  • 问题内容: 我必须使用python计算文本中的单词频率。我想到将单词保留在字典中,并对每个单词进行计数。 现在,如果我必须根据出现次数对单词进行排序。我可以使用相同的词典来代替使用具有键作为计数和单词数组作为值的新词典吗? 问题答案: 您可以使用相同的字典: 第二行显示: 如果只需要排序的单词列表,请执行以下操作: 该行打印:

  • 问题内容: 假设我有一个单词列表,并且我想查找每个单词出现在该列表中的次数。 一个明显的方法是: 但是我发现这段代码不是很好,因为该程序在单词列表中运行两次,一次构建集合,第二次计算出现次数。 当然,我可以编写一个函数来遍历列表并进行计数,但是那不是Pythonic。那么,有没有更有效和Pythonic的方法呢? 问题答案: 在类中模块是专为解决这类问题的目的:

  • 问题内容: 这是Python和NLTK新手问题。 我想查找双峰发生的频率,这些双峰发生在一起的次数超过10次,并且具有最高的PMI。 为此,我正在使用此代码 但是,这并不会将结果限制在前20位。我看到的结果的频率小于10。我是Python世界中的新手。 有人可以指出如何修改它以仅获得前20名。 谢谢 问题答案: 问题在于您尝试使用的方式。我们正在讨论单词搭配。如您所知,单词搭配是关于单词之间的依赖

  • 问题内容: 我有一张表,上面有像 我想做一张像这样的桌子 等等。 问题答案: WITH basedata(id,keywords) AS ( SELECT 1,’cat, dog, man, mouse’ union all SELECT 2 ,’man, pen, pencil, eraser’ union all SELECT 3,’dog, man, friends’ union all S

  • 如何有效地获取NumPy数组中每个唯一值的频率计数?