比较Java中的Map项列表

时间:2017-04-17 20:06:01

标签: java list foreach hashmap iterator

我有一个功能,我需要检查两个列表中的数据是否匹配。 该列表是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中的每个项目进行比较。

有更好的方法吗?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

这是伴侣... 比较两个Map List以确定Java8 Streams中具有多个过滤谓词的匹配记录和不匹配记录的最有效方法是:

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)中减去,以检索匹配结果,并且操作迅速。

干杯

Shubham Chauhan