You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何遍历Map获取两个指定Key的所有值并与数据库列对比

修复代码并实现需求:提取CSV指定列值并准备与数据库对比

先说说你当前代码里的几个明显问题:

  • 每次循环都新建key数组完全没必要,而且do-while里的i++会打乱外层循环的索引逻辑,很容易触发ArrayIndexOutOfBoundsException
  • 如果你的需求是获取Column2和Column6的所有值(包含重复项),那!ftlVal.contains(value)这个判断会错误过滤掉重复值;如果是要去重后的唯一值,用ArrayListcontains方法效率也很低,不如直接用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之后,你可以这么做:

  1. 编写SQL查询数据库中对应列的所有值(同样可选择保留重复或去重)
  2. 将数据库查询结果存入另一个集合(比如ArrayListHashSet
  3. 用集合的方法快速完成对比:
    • 检查两个集合是否完全一致:ftlVal.equals(dbValues)
    • 找出CSV有但数据库没有的值:new HashSet<>(ftlVal).removeAll(dbValues)
    • 找出数据库有但CSV没有的值:new HashSet<>(dbValues).removeAll(ftlVal)

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

火山引擎 最新活动