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

Java流按一个属性分组,并按另一个属性收集最大元素

司寇阳曦
2023-03-14

我想知道流(或收集器)中是否已经实现了一个功能,它首先按属性对流进行分组,然后返回列表中按另一个属性排序的第一个元素。例如,以下代码尝试使用第一个属性对对象流进行分组,然后希望收集第二个属性值最高的对象。

class MyClass{
 String att1;
 String att2;
}

现在,我想用流myClassStream实现类似的功能-

Map<String,MyClass> myMap = myClassStream().collect(Collectors.groupingBy(MyClass::getAtt1)); //Now I want to do Sorting after grouping to collect only the element which has the highest value of attr2.

我的代码使用简单的循环是:

Map<String, MyClass> postAnalyticsMap = new HashMap<>();
for (MyClass post : myClassList) {
      if (post.get(post.getAtt1()) == null) {
               post.put(post.getAtt1(), post);
      } else {
               MyClass existingClass = postAnalyticsMap.get(post.getAtt1());
               if (existingPostAnalytics.getAtt2() < post.getAtt2()) {
                    postAnalyticsMap.put(post.getAtt1(), post);
               }
        }
  }

任何帮助将不胜感激。

共有2个答案

唐高卓
2023-03-14

您可以这样做:

myClassStream()
     .collect(Collectors.groupingBy(MyClass::getAtt1,
            Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(MyClass::getAtt2)),
                            myClass -> myClass.map(MyClass::getAtt2).orElse(""))));
傅越
2023-03-14

使用带有合并功能的toMap查找第二个属性上的最大元素

Map<String, MyClass> map = myClassList.stream()
        .collect(Collectors.toMap(MyClass::getAtt1, Function.identity(),
                BinaryOperator.maxBy(Comparator.comparing(MyClass::getAtt2))));
 类似资料:
  • 问题内容: 给定以下课程(针对问题的简化): 我有一个包含该类的多个实例的实例,同一类型出现多次,但得分不同: 现在,我想收集流,以便结果仅包含每种类型得分最高的实例。 我尝试了什么 以下代码可以正常工作,但是我不确定它是否是“最佳”解决方案(除了可怕的阅读和格式设置): 和: 输出(正确): A:10 B:12 C:1 另外,我无法提取返回收集器的通用静态方法,因此我可以通过以下方式简单地在需要

  • 我有对象要按文档ID分组。分组后,我想获得它们的“最大值”。这就是我目前掌握的: 文档类: 重要的是,我已经实现了一个compareTo函数。我不确定在< code>groupingBy子句的< code>reducer参数中放什么。我也试过: 但无济于事。

  • 谁能帮帮我吗。我有一个物品清单——在我的例子中有啤酒厂。每个酿酒厂都有一些属性(字段),如姓名、地址、id、省份(所在州)等。。。一家酿酒厂(名称)可以位于多个省份。现在我需要解决的问题是:如何计算每个州的啤酒厂数量?所以,按省份分组。所有数据都是从csv文件读取的。我已经创建了返回啤酒厂列表的阅读器。当我尝试这个: 这将返回我键(省)和整个对象作为值。 我已经坐了几个小时了。我没有主意了。

  • 问题内容: 基本上,我有一个表,其中的字段标识创建消息的用户。 当我显示两个用户之间的对话(一组消息)时,我希望能够通过来对消息进行分组,但要采用一种棘手的方式: 假设有一些消息(按排序): 我想按以下顺序获得3个消息组: 它应该按 user_id 分组,直到看到一个不同的分组,然后再按该分组。 我正在使用PostgreSQL,并且很乐意使用特定于它的东西,无论哪种都能提供最佳性能。 问题答案:

  • 我有以下计数查询: 有没有办法使用single aggregation()和嵌套的$group来实现这一点mongodb@3.2? 我知道这是mapReduce()的一个经典用例,但我在这里没有选择,因为$group by parameters()是一个动态生成的属性,因此聚合阶段的构建也是动态的。 预期输出与两个计数查询的结果相同。-

  • 问题内容: 在Java 8中,如何通过检查每个对象的属性的不同性来使用API 过滤集合? 例如,我有一个对象列表,我想删除同名的人, 将对对象使用默认的相等性检查Person,所以我需要类似的东西, 不幸的是,该方法没有这种过载。如果不修改类内部的相等性检查,是否可以简洁地做到这一点? 问题答案: 考虑做一个有状态过滤器。这是一个函数,该函数返回一个谓词,该谓词保持先前状态的状态,并返回是否第一次