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

Java中对比List<List<String>>:修正缺失行与不匹配数据识别问题

问题分析

原代码的核心错误在于混淆了「缺失行」和「数据不匹配行」的判断逻辑:

  • 当preCSV中的行在postCSV里找不到完全匹配项时,原代码重复检查是否存在完全匹配行(和前置判断逻辑冗余),而非检查是否存在同结构(长度一致)但内容部分差异的对应行。
  • 对于preList1,postCSV中存在同位置、同结构的postList1,仅最后一个元素内容不同,理应归为「数据不匹配行」,但原代码错误将其判定为「缺失行」。
修正后的代码
import java.util.ArrayList;
import java.util.List;

public class CSVComparator {
    public static void main(String[] args) throws Exception {
        List<List<String>> preCSV = new ArrayList<>();
        List<List<String>> postCSV = new ArrayList<>();

        // 初始化preCSV数据
        List<String> preList1 = new ArrayList<>();
        preList1.add("apple");
        preList1.add("banana");
        preList1.add("cherries");
        preCSV.add(preList1);

        List<String> preList2 = new ArrayList<>();
        preList2.add("orange");
        preList2.add("pear");
        preList2.add("grape");
        preCSV.add(preList2);

        List<String> preList3 = new ArrayList<>();
        preList3.add("watermelon");
        preList3.add("kiwi");
        preList3.add("pineapple");
        preCSV.add(preList3);

        // 初始化postCSV数据
        List<String> postList1 = new ArrayList<>();
        postList1.add("apple");
        postList1.add("banana");
        postList1.add("cherry");
        postCSV.add(postList1);

        List<String> postList2 = new ArrayList<>();
        postList2.add("orange");
        postList2.add("pear");
        postList2.add("grape");
        postCSV.add(postList2);

        List<List<String>> missingLists = new ArrayList<>();
        List<List<String>> mismatchedData = new ArrayList<>();

        for (int i = 0; i < preCSV.size(); i++) {
            List<String> preList = preCSV.get(i);
            boolean isExactMatch = false;
            boolean hasMismatchedCounterpart = false;

            // 第一步:检查是否存在完全匹配的行
            for (List<String> postList : postCSV) {
                if (preList.size() == postList.size() && preList.equals(postList)) {
                    isExactMatch = true;
                    break;
                }
            }

            if (!isExactMatch) {
                // 第二步:检查是否存在同结构但内容不完全匹配的行
                for (List<String> postList : postCSV) {
                    if (preList.size() != postList.size()) {
                        continue;
                    }
                    boolean hasContentDiff = false;
                    for (int k = 0; k < preList.size(); k++) {
                        if (!preList.get(k).equals(postList.get(k))) {
                            hasContentDiff = true;
                            break;
                        }
                    }
                    if (hasContentDiff) {
                        hasMismatchedCounterpart = true;
                        break;
                    }
                }

                // 根据判断结果分类
                if (hasMismatchedCounterpart) {
                    mismatchedData.add(preList);
                } else {
                    missingLists.add(preList);
                }
            }
        }

        // 输出验证结果
        System.out.println("缺失行: " + missingLists); // 输出: 缺失行: [[watermelon, kiwi, pineapple]]
        System.out.println("数据不匹配行: " + mismatchedData); // 输出: 数据不匹配行: [[apple, banana, cherries]]
    }
}
关键修正点
  • 拆分判断逻辑:先确认是否为完全匹配行,若不是,再检查是否存在同结构但内容差异的对应行
  • 新增hasMismatchedCounterpart标记:专门识别在postCSV中有同结构但内容不符的行,这类行归入mismatchedData
  • 明确缺失行定义:仅当既无完全匹配行,也无同结构差异行时,才将该行归入missingLists

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:47:38