如何遍历Map获取两个指定Key的所有值并与数据库列对比
修复代码并实现需求:提取CSV指定列值并准备与数据库对比
先说说你当前代码里的几个明显问题:
- 每次循环都新建
key数组完全没必要,而且do-while里的i++会打乱外层循环的索引逻辑,很容易触发ArrayIndexOutOfBoundsException - 如果你的需求是获取Column2和Column6的所有值(包含重复项),那
!ftlVal.contains(value)这个判断会错误过滤掉重复值;如果是要去重后的唯一值,用ArrayList的contains方法效率也很低,不如直接用HashSet来自动去重
下面分两种常见场景给你修正后的代码:
场景1:获取指定列的所有值(保留重复)
适合需要逐行对比CSV与数据库对应值的场景:
// 把要提取的列名提前定义好,避免循环内重复创建 List<String> targetColumns = Arrays.asList("Column2", "Column6"); ArrayList<String> ftlVal = new ArrayList<>(); for (Map<String, String> map : finResult) { for (String column : targetColumns) { // 从当前行的Map中取出对应列的值 String value = map.get(column); // 可选:判断值非空再添加,避免存入无效的null值,可根据你的CSV数据情况调整 if (value != null) { ftlVal.add(value); } } } // 此时ftlVal已存储Column2和Column6的所有值 System.out.println(ftlVal);
场景2:获取指定列的去重后唯一值
适合只需要对比唯一值集合的场景,用HashSet自动去重效率更高:
List<String> targetColumns = Arrays.asList("Column2", "Column6"); Set<String> uniqueValues = new HashSet<>(); for (Map<String, String> map : finResult) { for (String column : targetColumns) { String value = map.get(column); if (value != null) { uniqueValues.add(value); } } } // 如果必须用ArrayList存储,直接转成List即可 ArrayList<String> ftlVal = new ArrayList<>(uniqueValues); System.out.println(ftlVal);
后续与数据库对比的思路
拿到ftlVal之后,你可以这么做:
- 编写SQL查询数据库中对应列的所有值(同样可选择保留重复或去重)
- 将数据库查询结果存入另一个集合(比如
ArrayList或HashSet) - 用集合的方法快速完成对比:
- 检查两个集合是否完全一致:
ftlVal.equals(dbValues) - 找出CSV有但数据库没有的值:
new HashSet<>(ftlVal).removeAll(dbValues) - 找出数据库有但CSV没有的值:
new HashSet<>(dbValues).removeAll(ftlVal)
- 检查两个集合是否完全一致:
内容的提问来源于stack exchange,提问作者Dolly




