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

