Java 8:按多个字段分组,然后根据值排序

2024-03-12

我有一堂课叫Info

public class Info {
    private String account;
    private String opportunity;
    private Integer value;
    private String desc;
}

我想将以下列表分组Info,按两个字段(帐户和机会),然后根据值对其进行排序。 IE。 分组和排序前的信息列表:

List<Info> infos = [(account = 1234, opportunity = abs, value = 4, desc= test),
(account = 1234, opportunity = abs, value = 5, desc = testing),
(account = 1234, opportunity = abss, value = 10, desc = vip),
(account = 123, opportunity = abss, value = 8, desc = vip),
(account = 12, opportunity = absddd, value = 4, desc = production),
(account = 12, opportunity = absooo, value = 2, desc = test)]

分组排序后我预期的结果,

Map<String, Map<String, List<Info>>> result = {
    1234 = {
        abss = [(account = 1234, opportunity = abss, value = 10, desc = vip)],
        abs = [(account = 1234, opportunity = abs, value = 5, desc = testing),  
               (account = 1234, opportunity = abs, value = 4, desc = test)]
    },
    123 = {
        abss = [(account = 123, opportunity = abss, value = 8, desc = vip)]
    },
    12 = {
        absddd = [(account = 12, opportunity = absddd, value = 4, desc = production)],
        absooo = [(account = 12, opportunity = absooo, value = 2, desc = test)]
    }
}

o/p 根据值排序(10->(5+4)->8->4->2)

到目前为止我已经尝试过=infos.stream().collect(Collectors.groupingBy(Info::getAccount, Collectors.groupingBy(r -> r.getOpportunity(), Collectors.toList())))但它的排序是随机的。


排序依据value of Info,

  1. 制作流sorted https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted-java.util.Comparator-,通过比较value,这样分组将按顺序执行。
  2. 打电话时分组依据 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy-java.util.function.Function-java.util.function.Supplier-java.util.stream.Collector-, 指定链接哈希映射 https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html in mapFactory保留插入顺序。

下面的程序演示了如何实现。


import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Info {
    private String account;
    private String opportunity;
    private Integer value;
    private String desc;

    private Info(String account, String opportunity, Integer value, String desc) {
        super();
        this.account = account;
        this.opportunity = opportunity;
        this.value = value;
        this.desc = desc;
    }

    public static void main(String[] args) {
        List<Info> infos = new ArrayList<>();
        infos.add(new Info("12", "absddd", 4, "production"));
        infos.add(new Info("1234", "abss", 10, "vip"));
        infos.add(new Info("1234", "abs", 4, "test"));
        infos.add(new Info("1234", "abs", 5, "testing"));
        infos.add(new Info("123", "abss", 8, "vip"));
        infos.add(new Info("12", "absooo", 2, "test"));
        Map<String, Map<String, List<Info>>> sortedResult = infos.stream().sorted(Info::compareByValueDesc)
                .collect(Collectors.groupingBy(Info::getAccount, LinkedHashMap::new,
                        Collectors.groupingBy(r -> r.getOpportunity(), LinkedHashMap::new, Collectors.toList())));
        sortedResult.forEach((key, value) -> System.out.println(key + value.toString()));
    }

    public static int compareByValueDesc(Info other1, Info other2) {
        return -other1.value.compareTo(other2.value);
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getOpportunity() {
        return opportunity;
    }

    public void setOpportunity(String opportunity) {
        this.opportunity = opportunity;
    }

    public String toString() {
        return this.value.toString();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8:按多个字段分组,然后根据值排序 的相关文章

  • Haskell - lambda 表达式

    我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式 我不太明白使用 lambda 表达式相对于定义函数的约定方式有何优势 例如 我通常会执行以下操作 let add x y x y 我可以简单地打电话 add
  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • 主键和外键索引

    我有一个使用 GUI 工具创建的数据库 我注意到使用不一致KEY aka INDEX 定义 CREATE TABLE foo bar foo id int 10 unsigned NOT NULL bar id int 10 unsigne
  • 用户离开站点时显示消息

    我正在寻找一种方法 如果用户在仅查看一个页面后离开我的网站 则向用户显示一条消息 我找到了这个 http www pgrs net 2008 1 30 popup when leaving website http www pgrs net
  • IOError:[Errno 13]权限被拒绝:'/usr/local/bin/django-admin.py'

    为什么我会得到这个 IOError Errno 13 Permission denied usr local bin django admin py 我跑后pip install django 1 9这是一个问题吗 如果你在安装时看到这个
  • VBA 函数参数列表选择

    我想做类似以下的事情 Public Function myFunc vArg1 as string vArg2 as string vArg3 as A B C End Function 用户调用 vArg3 时会得到一个下拉列表 这类似于
  • 重新创建队列并重新连接到rabbitMQ

    涉及的组件 Spring Config 服务器 Spring AMQP RabbitMQ Spring Config 客户端 Goal 使用推送通知通知配置客户端刷新配置 RabbitMQ 实例 从 docker hub 中 我拉出了rab
  • 在 ExpressJS 中执行 res.send() 之前修改响应正文

    在我目前开发的应用程序中 它使用 Express 就我而言 我想在发送之前获得响应并对其进行修改 出于 JWT 的目的 在此应用程序中 有十几个端点 我不想创建自己的函数 例如sendAndSign 并替换res send 代码中随处可见
  • 与大型开发团队一起管理分发证书

    我是一个开发团队的一员 该团队的许多应用程序跨越多个业务部门和 iOS 团队 我们现在在管理分发证书时遇到很多麻烦 Apple 允许您在一个开发帐户上拥有 3 个分发证书 但无法对证书进行唯一命名 因此它们看起来都一样 不同证书的唯一识别信
  • 我是否可以/应该使用数据库中过去(例如每月)的标签列作为 ML 预测中的特征(无时间序列!)?

    问题 使用标签的过去作为特征是正常 平常 专业吗 尽管这是一个基本问题 但我找不到任何可靠的信息 编辑 请注意 这不是一个时间序列问题 我现在删除了时间序列标签并更改了问题 这个问题是关于随着时间的推移定期变化的功能 是的 但我们不会据此创
  • Helm:错误:找不到可用的版本名称

    我在使用 Helm 时遇到了一些错误 在其他地方找不到这些错误的解释 两个错误如下 Error no available release name found Error the server does not allow access t
  • 使用命令行将 *.xls 或 *.xlsx 文件转换为管道分隔的 .csv 文件

    我有一个像这样的 xlsx 文件 样本 xlsx Heading C1 C2 01 02 C3 C4 R1 1 4 7 10 R2 2 5 8 11 1 R3 3 6 9 0 12 我想将sample xlsx 文件转换为Output cs
  • Google Fonts 中无法访问的字形和符号

    一旦在网站上实施字体 Google 字体样本表上显示的某些字形将不可用 例如 看看 Piazzolla 的预览 请注意箭头如何使用字体提供的自定义字形 然后 将其与此进行比较codepen https codepen io drw158 p
  • Mysql 用前一条记录的值更新一条记录

    我有下表 我想要做的是更新 RefID 3 14 其状态值与之前的值 已添加 相同 我想这样做 直到它达到下一个完成值 因此 当它遇到 已添加 时 它会用 已添加 更新下面所有具有空值的行 直到到达下一个具有已填充状态的 RefID 然后更
  • 在java中,可以创建一个流畅的可扩展类层次结构,其中的方法可以按任何顺序调用吗?

    能否在java中创建一个可扩展的类层次结构 其方法是流畅的并且可以按任何顺序调用 是的 请参阅下面的答案 即使对于无法访问源代码的现有类 只要方法流畅 我正在改造现有的层次结构 并希望使用工厂或至少使用通用构造函数和 最终 不可变的构建器模
  • 响应式引导导航栏中的中心内容

    我无法将内容集中在引导导航栏中 我正在使用 bootstrap 3 我读过很多帖子 但是使用的 CSS 或方法不适用于我的代码 我真的很沮丧 所以这是我最后的选择 任何帮助 将不胜感激
  • R 累积和,但顺序相反

    我有一个 data table 我想在其中添加一个新列 该列的累积总和为var列 但顺序相反 structure list date c 2020 09 18 2020 09 25 2020 09 30 2020 10 02 2020 10
  • F# 自定义运算符优先级

    在 F 中 您可以定义自定义运算符 例如 let input pattern Regex IsMatch input pattern 与 Haskell 不同 自定义运算符的定义没有优先级 F 中自定义运算符的运算符优先级是什么 运算符优先
  • windows.location.href 不适用于 Firefox3

    我们有一个名为 move 的 JavaScript 函数 它只执行 windows location href 任何给定的锚点 该函数适用于 IE Opera 和 Safari 但在 Firefox 中却被忽略 谷歌搜索并没有得到满意的答案
  • C# 结构 - 从外部库访问类

    我对构建我的应用程序的正确方法有疑问 我是 C 的初学者 所以如果我缺少一些基础 请原谅 我在网上查看 不仅是stackoverflow 但没有找到任何答案 所以也许这只是因为我做错了什么 我有一个项目 其中有几个类来定义我的对象 Obje
  • 抽象方法中的 PHP 类型提示接口和方法实现中的类型提示接口的子类

    想象一下我有一个简单的界面 interface A 然后 我有一些实现该接口的类 class B implements A class C implements A 然后 我有一个类 它有一个需要类 B 的对象作为参数的方法 我不能在这里使
  • Java 8:按多个字段分组,然后根据值排序

    我有一堂课叫Info public class Info private String account private String opportunity private Integer value private String desc