You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何将List<List<Object>>转换为按字段去重的嵌套列表

问题说明

需要对List<List<Object>>类型的二维结构化数据做格式转换,按列维度提取每列的去重值,最终组装为新的List<List<Object>>结构。

测试输入

List<List<Object>> data = new ArrayList<>();
List<Object> list1 = new ArrayList<>();
List<Object> list2 = new ArrayList<>();
List<Object> list3 = new ArrayList<>();
List<Object> list4 = new ArrayList<>();
List<Object> list5 = new ArrayList<>();
List<Object> list6 = new ArrayList<>();

list1.add("Siva"); 
list1.add("20");
list1.add("Hyd");
list1.add("India");  

list2.add("Siva");    
list2.add("22"); 
list2.add("Banglore"); 
list2.add("India");

list3.add("Ramesh"); 
list3.add("22");
list3.add("Chennai"); 
list3.add("India");

list4.add("Ramesh"); 
list4.add("24");
list4.add("Kochi"); 
list4.add("US");

list5.add("Suresh"); 
list5.add("25");
list5.add("Chennai"); 
list5.add("UK");

list6.add("Suresh"); 
list6.add("24");
list6.add("Hyd"); 
list6.add("UK");

data.add(list1);
data.add(list2);
data.add(list3);
data.add(list4);
data.add(list5);
data.add(list6);

输出规则

  • 输出结构为List<List<Object>>
  • 按原始数据的列顺序,依次提取姓名、年龄、城市、国家四列的所有取值
  • 每列取值需去重,保留值首次出现的顺序

期望输出

[[Siva,Ramesh,Suresh],[20,22,24,25],[Hyd,Banglore,Chennai,Kochi],[India,US,UK]]

实现方案

基于Java 8 Stream原生API实现,无第三方依赖,代码简洁且自动保留取值顺序:

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

public class ColumnDistinctConverter {
    public static List<List<Object>> extractColumnDistinctValues(List<List<Object>> source) {
        // 空值校验,兼容边界场景避免空指针
        if (source == null || source.isEmpty() || source.get(0).isEmpty()) {
            return Collections.emptyList();
        }
        int columnNum = source.get(0).size();
        // 逐列提取值并去重
        return IntStream.range(0, columnNum)
                .mapToObj(colIndex -> source.stream()
                        .map(row -> row.get(colIndex))
                        .distinct() // 基于equals判断重复,默认保留元素首次出现顺序
                        .collect(Collectors.toList())
                )
                .collect(Collectors.toList());
    }
}

逻辑说明

  • 入参阶段做空值判断,空输入直接返回空列表,避免运行时异常
  • 通过列索引遍历所有列,替代传统多层for循环的冗余写法
  • distinct()方法去重逻辑完全匹配需求,不需要手动实现顺序保留逻辑
  • 所有实现基于JDK原生API,兼容性强,可以直接嵌入业务代码使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 00:39:36