You need to enable JavaScript to run this app. Java对象分组实现:每组无重复指定字段值的分组方案
优惠活动
大模型
产品
解决方案
定价
更多

Java对象分组实现:每组无重复指定字段值的分组方案

实现思路说明

你遇到的需求本质是按field1值拆分元素,将同值元素均匀分配到不同分组,保证每个分组内不存在重复field1值,这和Collectors.groupingBy的原生逻辑(将同key元素归集到同一集合)完全相悖,因此无法直接通过该方法一步实现。
实现逻辑的核心步骤可以拆解为3步:

  • 先将所有元素按field1值做临时分组,拿到每个field1值对应的全部元素列表
  • 统计所有field1值对应的元素数量,取最大值作为最终需要生成的分组总数
  • 遍历每个临时分组的元素,按元素在临时列表中的索引位置,将其放入对应序号的最终分组中,从根源上避免同field1值的元素落在同一个分组内

完整可运行代码

首先需要为示例的MyObject类补充必要的getter和toString方法,否则无法读取属性值、也不方便校验结果:

public class MyObject {
    private String field1;

    public MyObject(String field1) {
        this.field1 = field1;
    }

    public String getField1() {
        return field1;
    }

    @Override
    public String toString() {
        return "MyObject{field1='" + field1 + "'}";
    }
}

核心业务逻辑实现:

import java.util.*;
import java.util.stream.Collectors;

public class GroupDemo {
    public static void main(String[] args) {
        MyObject o1 = new MyObject("1");
        MyObject o2 = new MyObject("1");
        MyObject o3 = new MyObject("1");
        MyObject o4 = new MyObject("2");
        MyObject o5 = new MyObject("2");
        MyObject o6 = new MyObject("3");
        List<MyObject> list = Arrays.asList(o1, o2, o3, o4, o5, o6);

        // 临时按field1分组,拿到每个值对应的元素列表
        Map<String, List<MyObject>> tempGroup = list.stream()
                .collect(Collectors.groupingBy(MyObject::getField1));

        // 计算最终需要的分组数量:取所有临时组的最大长度
        int groupCount = tempGroup.values().stream()
                .mapToInt(List::size)
                .max()
                .orElse(0);

        // 初始化指定数量的空分组
        List<List<MyObject>> listsWithUniqueField1Values = new ArrayList<>();
        for (int i = 0; i < groupCount; i++) {
            listsWithUniqueField1Values.add(new ArrayList<>());
        }

        // 将临时组的元素按索引分发到对应最终分组
        for (List<MyObject> sameField1Elements : tempGroup.values()) {
            for (int i = 0; i < sameField1Elements.size(); i++) {
                listsWithUniqueField1Values.get(i).add(sameField1Elements.get(i));
            }
        }

        // 可选:若需要固定每个分组内的元素顺序,可加排序逻辑
        listsWithUniqueField1Values.forEach(group -> 
                group.sort(Comparator.comparing(MyObject::getField1))
        );

        // 输出结果和预期完全一致
        System.out.println(listsWithUniqueField1Values);
    }
}

运行结果验证

上述代码执行后输出的内容完全匹配你期望的结构:

[
  [MyObject{field1='1'}, MyObject{field1='2'}, MyObject{field1='3'}],
  [MyObject{field1='1'}, MyObject{field1='2'}],
  [MyObject{field1='1'}]
]

内容的提问来源于stack exchange,提问作者Paoloeno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 05:54:06