【问题标题】:Comparing List of Map items in Java比较 Java 中的地图项列表
【发布时间】:2017-09-13 12:03:31
【问题描述】:

我有一个功能,我需要检查两个列表中的数据是否匹配。 该列表是Map <String, Object> 类型的链表。我应该如何迭代以最有效的方式比较列表中的每个项目?

现在我正在尝试做这样的事情:

public boolean compare(List<Map<String, Object>> A,
            List<Map<String, Object>> B) {
        //Code for iteration 
        boolean result = false;
        if(A.size() == B.size()) {    
            int count = 0;
            for(Map<String, Object> a : A)
            {
                for(Map<String, Object> b : B)
                {
                    if (a.get('aID') == b.get('aID'))
                        count++;
                }
            }
            if(count == A.size()) {
                result = true;
            }
        }    
        else {
            //Data reconciliation failed :: Data size mismatch
        }
        return result;
    }

但这是一种低效的方法,因为 A 中的每个项目都与 B 中的每个项目进行比较。

有更好的方法吗?

【问题讨论】:

  • 对于基本的Java 实现,例如LinkedListequals(Object other) 方法应该能正确地做你想做的事情。
  • 同样,对于 Object 不要使用 ==,使用 Object.equals()。
  • 列表是不同的。它们是某些表的行映射列表。两个表中的数据相似,但表结构不同,因此我在回填后对数据进行协调,这需要比较每个条目。它们不是同一个对象。
  • A 是表 A 的行列表,B 是表 B 的行列表。它们具有相同的数据,但表结构不同,因此需要对每一行进行比较以进行验证。
  • 这里有编译错误,a不在定义的范围内。 if(count == a.size()) { result = true; },因此您的代码无论如何都不应该编译。 Aka,修复你的缩进并确保你的括号匹配。字符串文字也用双引号而不是单引号表示

标签: java list foreach hashmap iterator


【解决方案1】:

这里是朋友... 在 Java8 Streams 中比较两个 Map 列表以识别具有多个过滤谓词的匹配和不匹配记录的最有效方法是:

List<Map<String,String>> unMatchedRecords = dbRecords.parallelStream().filter(searchData ->
                inputRecords.parallelStream().noneMatch( inputMap ->
                        searchData.entrySet().stream().noneMatch(value ->
                                inputMap.entrySet().stream().noneMatch(value1 ->
                                        (value1.getKey().equals(value.getKey()) &&
                                                value1.getValue().equals(value.getValue()))))
                )).collect(Collectors.toList());

注意:

如果上面使用的 ,不要忘记为 .getKey() 和 value.getKey() 应用 .toString()。

这样得到的不匹配记录,可以很容易地从任何一个列表(即dbRecords或inputRecords)中减去以检索匹配结果,并且操作迅速。

干杯,

舒巴姆乔汉

【讨论】:

    【解决方案2】:

    您可以遍历列表一次并比较每个列表中的地图。这会将您的 Big-O 运行时间减半——假设地图的顺序正确(即通过 LinkedList)。

    public boolean compare(List<Map<String, Object>> A, List<Map<String, Object>> B) {
        // check size first
        if (A.size() == B.size()) {
          // if the Maps are abstracted into a POJO you could implement Comparator on that POJO.  In the meantime you can sort manually
          // sort A
          Collections.sort(A, new Comparator<Map<String, String>>() {
            public int compare(final Map<String, String> o1, final Map<String, String> o2) {
                // optionally, you could use any method of sorting here... single field like an ID, multiple fields compared, sums, etc.
                return o1.get("field").compareTo(o2.get("field"));
            }
        });
    
          // sort B
          Collections.sort(B, new Comparator<Map<String, String>>() {
            public int compare(final Map<String, String> o1, final Map<String, String> o2) {
                return o1.get("field").compareTo(o2.get("field"));
            }
        });
    
    
            for (int i = 0; i < A.size(); i++) {
                // get map from A & B
                Map<String, Object> aMap = A.get(i);
                Map<String, Object> bMap = B.get(i);
    
                // check equality of Maps
                if (!aMap.equals(bMap)) {
                    return false;
                }
            }
        } else {
            // Data reconciliation failed :: Data size mismatch
            return false;
        }
    
        // if we get here then all was good
        return true;
    }
    

    【讨论】:

    • 但是当我们从两个不同的表中检索数据到这些列表中时,它们并没有按特定的顺序排列。所以我们不能线性检查。包含公共数据的行可以出现在列表 A 中的第一个位置,但 n-1 或 n-2 或列表 B 中的任何其他位置。因此必须通过键比较进行检查。
    • 嗯...当列表进入比较方法时,您可以对其进行排序。我不知道您的地图中的细节,但会更新示例以说明...
    • 选择作为答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多