Java中基于ID关联JsonObject列表并统计计数差值分类
基于ID关联两个JsonObject列表并分类计数差值
需求说明
从两个数据库分别获取包含表信息的JsonObject列表,以ID_COL为关联键,计算DB2_COUNT - DB1_COUNT的差值DIFF_COUNT:
- 差值为0的记录归入
success列表 - 差值不为0的记录归入
reject列表
实现思路
- 将其中一个列表(如
result2)转换为以ID_COL为键的Map,实现O(1)时间复杂度的快速查找,避免双重遍历的低效问题 - 遍历另一个列表(如
result1),通过ID_COL从Map中匹配对应的记录 - 提取两个记录的计数字段,转换为数值类型后计算差值
- 合并两个记录的字段并添加
DIFF_COUNT,根据差值结果分类到对应列表
示例代码(Java)
import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TableCountComparator { public static void main(String[] args) { // 模拟从数据库获取的结果集 List<JSONObject> result1 = new ArrayList<>(); result1.add(new JSONObject("{\"ID_COL\":\"Table1\",\"DB1_TABLE_NAME\":\"Table1\",\"DB1_COUNT\":\"10\"}")); result1.add(new JSONObject("{\"ID_COL\":\"Table2\",\"DB1_TABLE_NAME\":\"Table2\",\"DB1_COUNT\":\"20\"}")); List<JSONObject> result2 = new ArrayList<>(); result2.add(new JSONObject("{\"ID_COL\":\"Table1\",\"DB2_TABLE_NAME\":\"Table1\",\"DB2_COUNT\":\"10\"}")); result2.add(new JSONObject("{\"ID_COL\":\"Table2\",\"DB2_TABLE_NAME\":\"Table2\",\"DB2_COUNT\":\"40\"}")); // 将result2转为ID映射,加速匹配 Map<String, JSONObject> result2IdMap = new HashMap<>(); for (JSONObject tableObj : result2) { String tableId = tableObj.getString("ID_COL"); result2IdMap.put(tableId, tableObj); } // 初始化结果列表 List<JSONObject> successList = new ArrayList<>(); List<JSONObject> rejectList = new ArrayList<>(); // 遍历result1,关联计算差值并分类 for (JSONObject db1Table : result1) { String tableId = db1Table.getString("ID_COL"); JSONObject db2Table = result2IdMap.get(tableId); if (db2Table != null) { // 转换计数字段为整数 int db1Count = Integer.parseInt(db1Table.getString("DB1_COUNT")); int db2Count = Integer.parseInt(db2Table.getString("DB2_COUNT")); int diff = db2Count - db1Count; // 合并生成结果对象 JSONObject resultObj = new JSONObject(); resultObj.put("ID_COL", tableId); resultObj.put("DB1_TABLE_NAME", db1Table.getString("DB1_TABLE_NAME")); resultObj.put("DB2_TABLE_NAME", db2Table.getString("DB2_TABLE_NAME")); resultObj.put("DIFF_COUNT", diff); // 分类添加到对应列表 if (diff == 0) { successList.add(resultObj); } else { rejectList.add(resultObj); } } // 可根据需求处理ID不匹配的情况,例如加入reject或记录日志 } // 输出结果 System.out.println("success = " + successList); System.out.println("reject = " + rejectList); } }
关键注意点
- 性能优化:使用Map做索引将时间复杂度从O(n²)降低到O(n),适合处理大规模数据
- 类型转换:计数字段为字符串类型,必须转换为数值类型后才能进行差值计算
- 异常处理:实际场景中建议添加类型转换异常捕获,以及ID不匹配的处理逻辑(如记录缺失表信息)
内容的提问来源于stack exchange,提问作者Sucheta
相关产品推荐
相关产品推荐

