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

如何使用Java streams[重复]查找不同对象的计数

柴兴修
2023-03-14

我有一个Thing对象列表:

class Thing {
    public String id;
    public String name;
}

<代码>列表

[{'1', 'AB'},{'2', 'CD'},{'1', 'AB'},{'1','AB'},{'2','CD'},{'3','EF'}]

现在,我想使用Java streams或任何util函数来获得id的不同计数:我希望输出为,

id   count
1    3
2    2 
3    1

我如何才能实现这一点?

共有2个答案

尹臻
2023-03-14

也可以使用toMap收集器:

lst.stream().collect(toMap(Thing::getId, v -> 1, Math::addExact));

创建地图

或地图::合并:

Map<String, Integer> accumulator = new HashMap<>();
lst.forEach(t -> accumulator.merge(t.getId(), 1, Math::addExact));

与上面的想法相同,如果Thing::getId已经存在于累加器映射中,我们将它们与Math::addExact合并,否则我们将提供的键和值累加到映射中。

如果订单如您的帖子所示重要,那么您可以使用LinkedHashMap而不是上面的HashMap

您还可以提供一个映射,将元素累积到其中以保持toMap收集器中的顺序:

lst.stream().collect(toMap(Thing::getId, v -> 1, Math::addExact, LinkedHashMap::new));

或使用groupingBy收集器:

lst.stream()
   .collect(Collectors.groupingBy(Thing::getId, 
                LinkedHashMap::new,
                Collectors.counting()));

徐高懿
2023-03-14

您可以使用收集器获取它。按id属性分组,然后计算其出现次数,如下所示:

List<Thing> objects = new ArrayList<>(); // initalise as in the question 
Map<String, Long> countForId = objects.stream()
        .collect(Collectors.groupingBy(Thing::getId, Collectors.counting()));
 类似资料:
  • 我想用不同的列值执行相同的SQL查询,即:我有一个如下表: 从上表中,我想获取员工组的和。请建议我如何在不执行多次的情况下进行查询以获取上述数据。

  • 所以这个问题以前被问过,但我的情况有点不同,因为我已经尝试了这个网站中建议的所有解决方案,我有一个多提及数组: 我还有另一个小数组: 我只想找到与这个“dup”在同一行的“original”。到目前为止,我尝试了查找、过滤和grep,但这些都没有解决我的问题。 我尝试过的代码:

  • 给定这样一组对象: 是否有一种方法可以使用ES6在一组对象中找到匹配的对象关键点(本例中为playerId),然后为这些匹配组合其他对象关键点(辅助和点),以便最终的数组如下所示:

  • 我正在尝试编写一个方法,该方法可以在列表列表中找到对象的索引并利用并行性。这是我的代码。 当我运行以下代码时 输出类似于 换句话说,即使在找到对象之后,搜索仍在继续。不应该是短路操作吗?我错过了什么?此外,在迭代列表或锯齿数组时,利用并行性的最佳方法是什么? 编辑 按照@Sotirios回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。

  • 我正在试图理解为什么下面的代码会像它那样运行。具体而言,为什么第一个表达式会输出的完整和最终版本?我意识到这和吊装有关(也许?)或者其他一些我没有完全理解的概念。只是在网上搜索这个是很有挑战性的,因为我没有合适的词库来搜索我想知道的东西。 我在为自己编写代码时发现了这一点,其中我希望通过for-loop看到对象在每次迭代时的状态。我很惊讶地看到输出到控制台的对象在每一个回合都是一样的;该状态是整个

  • 我有一个数组。如何按类型、名称和大小以及递增量找到双重许可。增加数量后删除相同的。