比较两个地图&识别现有密钥的修改值

时间:2018-03-08 05:12:23

标签: java apache-poi

我正在解决一个问题,我第一次想要上传 Excel文件,请阅读它&存储到MySQL数据库中。我完成了这部分&一切都按预期工作。

每当我再次上传 Excel文件时,第二次形成表格(Excel文件可以与数据库具有完全相同的数据或修改现有数据,或者修改现有数据和新添加的数据),我要将它与MySQL和MySQL中的数据进行比较。确定变化。 我正在使用 Apache POI 库&amp; amp;读取Excel文件。将其存储在Map<Integer, List<MyCell>中,其中键是行号&amp;它的值为List<MyCell>,基本上是列列表。 我能够识别新添加的记录(新添加的密钥及其值 a Map)这个逻辑

Map<Integer, List<MyCell>> filteredMap = new HashMap<>();
for (Integer key : datafromExcel.keySet()) {
    if (datafromDB.containsKey(key)) {
        datafromDB.remove(key);
    } else {
            filteredMap.put(key, datafromExcel.get(key));
    }
}

但我没有成功找到现有的修改记录(地图中现有修改后的相同键值)

我怎么能得到这个?

2 个答案:

答案 0 :(得分:0)

要检查修改后的值,您必须将来自DB和excel的列表与相应的键进行比较。 就像我在这里展示列表的比较一样:

      Collection<String> similar = new HashSet<String>( fromDB.get(key) );
      Collection<String> different = new HashSet<String>();
      different.addAll( fromDB.get(key) );
      different.addAll( fromExcel.get(key) );

      similar.retainAll( fromExcel.get(key) );
      different.removeAll( similar );
      if(different.size()>0){
         SOP("NO CHANGE");
      }

根据你的逻辑修改如果MyCell(我在这里使用过String)是一个类,你可以使用比较器。

希望这会有所帮助

答案 1 :(得分:0)

对于数据库中存在的密钥,您调用的是datafromDB.remove(key);

所以你立即找到修改后的记录,删除它并且不再知道你有这样的记录。显然,您必须执行超过datafromDB.remove(key);的操作,或者根本不删除密钥数据。