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
相关产品推荐
相关产品推荐

