Java 8 在分组时不保持顺序

2023-12-01

我正在使用 Java 8 按数据分组。但获得的结果并不是按顺序形成的。

Map<GroupingKey, List<Object>> groupedResult = null;

        if (!CollectionUtils.isEmpty(groupByColumns)) {

            Map<String, Object> mapArr[] = new LinkedHashMap[mapList.size()];

            if (!CollectionUtils.isEmpty(mapList)) {
                int count = 0;
                for (LinkedHashMap<String, Object> map : mapList) {
                    mapArr[count++] = map;
                }
            }
            Stream<Map<String, Object>> people = Stream.of(mapArr);
            groupedResult = people
                    .collect(Collectors.groupingBy(p -> new GroupingKey(p, groupByColumns), Collectors.mapping((Map<String, Object> p) -> p, toList())));


public static class GroupingKey 

        public GroupingKey(Map<String, Object> map, List<String> cols) {

            keys = new ArrayList<>();

            for (String col : cols) {
                keys.add(map.get(col));
            }
        }

        // Add appropriate isEqual() ... you IDE should generate this
        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final GroupingKey other = (GroupingKey) obj;
            if (!Objects.equals(this.keys, other.keys)) {
                return false;
            }
            return true;
        }

        @Override
        public int hashCode() {
            int hash = 7;
            hash = 37 * hash + Objects.hashCode(this.keys);
            return hash;
        }

        @Override
        public String toString() {
            return keys + "";
        }

        public ArrayList<Object> getKeys() {
            return keys;
        }

        public void setKeys(ArrayList<Object> keys) {
            this.keys = keys;
        }

    }

在这里,我使用我的类 groupingKey,通过它我可以从 ux 动态传递。如何以排序形式获得此 groupByColumns ?


不维持秩序是其财产Map存储结果。如果您需要特定的Map行为,你需要请求特定的Map执行. E.g. LinkedHashMap保持插入顺序:

groupedResult = people.collect(Collectors.groupingBy(
    p -> new GroupingKey(p, groupByColumns),
    LinkedHashMap::new,
    Collectors.mapping((Map<String, Object> p) -> p, toList())));

顺便说一句,没有理由复制内容mapList在创建之前将其放入数组中Stream。您可以简单地致电mapList.stream()以获得合适的Stream.

更远,Collectors.mapping((Map<String, Object> p) -> p, toList())已经过时了。p->p是一个身份映射,所以没有理由请求mapping at all:

groupedResult = mapList.stream().collect(Collectors.groupingBy(
    p -> new GroupingKey(p, groupByColumns), LinkedHashMap::new, toList()));

但即使是GroupingKey已经过时了。它基本上包含了一个List值,所以你可以只使用List首先作为关键。List实施hashCode and equals适当地(但你must not修改这些键值List之后)。

Map<List<Object>, List<Object>> groupedResult=
  mapList.stream().collect(Collectors.groupingBy(
    p -> groupByColumns.stream().map(p::get).collect(toList()),
    LinkedHashMap::new, toList()));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8 在分组时不保持顺序 的相关文章

随机推荐

  • 在 Shell 中重命名逆序编号的文件

    我正在寻找一种实用的方法来在 shell 中进行此练习 我有这些文件 1 txt 2 txt 3 txt 4 txt 5 txt 50 txt 我想这样重命名 50 txt 1 txt 49 txt 2 txt 48 txt 3 txt 以
  • MySQL计算N行的移动平均值

    我正在尝试计算移动平均值ofN 行 for单个查询中的所有行 在示例中 我尝试计算 50 行的移动平均值 SELECT h1 date h1 security id SELECT AVG last50 close FROM SELECT h
  • jsdom.env 不是将 svg 导出到图像的函数

    我正在尝试根据以下教程将 d3 svg 图像转换为图像 https github com hugolpz svgcreator node js 我安装以下语句 sudo npm install g jsdom d3js npm instal
  • 如何在我的 Netbeans 项目中包含外部 jar

    当我运行 清理并构建 时 jar正在创建的文件仅在以下情况下运行lib文件夹与 jar file 因此 如果我将 jar 文件移动到桌面并保留lib文件夹中的dist文件夹中 jar 文件会给我一个例外 我该如何处理这个问题 我通过仅创建一
  • docker run 命令出现“Exec 格式错误”

    我有这个基于 Golang 的 Dockerfile FROM golang latest RUN mkdir p app WORKDIR app COPY bin huru CMD huru 我检查了一下 huru 二进制文件位于工作目录
  • X11 - 图形渲染改进

    我目前正在将无符号整数数组渲染到窗口上的二维图像 但是 对于我想要用它完成的任务来说 它太慢了 这是我的代码 int x 0 int y 0 GC gc XGCValues gcv gc XCreateGC display drawable
  • 我们怎样才能让 Watir-Webdriver 处理 IE 无效证书屏幕?

    我们在测试时可能都见过这个屏幕 您所需要的只是一个带有自签名证书的 HTTPS 站点 然后您会看到 此网站的安全证书有问题 屏幕 这需要您单击链接才能继续 对于 Watir 这不是问题 我可以像处理任何其他网页一样自动化屏幕 根据其文本或
  • 将数据框列和外部列表传递给 withColumn 下的 udf

    我有一个具有以下结构的 Spark 数据框 bodyText token 具有标记 已处理 单词集 我有一个定义关键字的嵌套列表 root id string nullable true body string nullable true
  • Discord.py - 服务器静音用户

    我正在使用discord py 但不使用命令 我无意改变 为了解释机器人的目标 我将使用一个小方案 服务器成员发送如下消息 Start user 0001 ping 到的用户的服务器静音 任何人都听不到他在任何语音聊天中的声音 10秒过去
  • PHP日期计算

    PHP 中计算指定格式的两个日期之间的天数差异的最佳方式是什么 与日期格式无关的方式 我尝试了以下功能 function get date offset start date end date start time strtotime st
  • T/SQL 中的日期范围

    对于我正在工作的当前项目 我需要返回基于日期范围的汇总报告 我有 3 种类型的报告 年度 月度和日报 为了帮助返回此报告 我需要一个函数来返回一个大范围内的所有日期时间子范围 因此 例如 如果我对于 2006 01 01 11 10 00
  • 无服务器 - Numpy - 无法找到良好的绑定路径格式

    我已经为此奋斗了一个多星期 并浏览了各种论坛问题和帖子 但无法解决 我正在尝试将 numpy 打包在一个函数中 单独构建需求 我有多个函数 其中有多个需求 我想将它们分开 环境 Windows 10 家庭版 适用于 Windows 的 Do
  • 使用回收器视图播放 YouTube 视频

    我正在尝试从数据库获取 youtube id 来播放视频 然后在我的布局中使用 recyclerview 我想将其显示在我的设备上 我通过使用字符串数组来完成此操作 我只想在回收视图中播放 youtube 的视频 但我不断收到错误 java
  • TailwindCSS - 有没有办法不多次写入相同的前缀?例如“悬停:”

    问题 class hover bg blue 400 hover translate y 2 hover translate x 2 hover scale 110 hover shadow 2xl hover shadow blue 40
  • 如何从 URL 中删除 /umbraco/surface/?

    我的 Umbraco 网址有 umbraco surface 在他们中 例如 http localhost 50656 umbraco Surface HealthInsurance Application Pid 26665 Lid 73
  • 添加时出现有趣的(四舍五入?)错误

    一列包含数字 始终保留 2 位小数 有些是计算得出的 但所有乘法和除法四舍五入到 2 位小数 另一列是累积的 累积列有公式
  • 在主页上显示类别及其产品,Magento 1.9

    我想在主页上显示一个类别及其产品 Magento 内置了在主页上显示新产品的选项 但我不知道如何在主页上显示不同的类别 例如我创建了一个类别 我想在主页上显示该类别中的产品 如下所示 特色产品 产品1 产品2 产品3 我已经尝试过下面的代码
  • 如何更改 perf_event_open 最大采样率

    我正在使用 perf event open 来获取样本 我试图让每个人都切中要害 但 perf event open 不够快 我尝试使用以下命令更改采样率 echo 10000000 gt proc sys kernel perf even
  • 权限被拒绝(公钥)。致命:无法从远程存储库读取

    我的中有以下内容 git config 1 core 2 repositoryformatversion 0 3 filemode true 4 bare false 5 logallrefupdates true 6 remote ori
  • Java 8 在分组时不保持顺序

    我正在使用 Java 8 按数据分组 但获得的结果并不是按顺序形成的 Map