简体   繁体   English

如何比较两个哈希图?

[英]how to compare two hash maps?

How to compare the values in both hash maps with the help of keys ? 如何借助键比较两个哈希图中的值? Since the keys are identical whereas values are'nt. 由于键是相同的,而值不是。 and return boolean result for each key comparision. 并返回每个键比较的布尔结果。 like: 喜欢:

map1=[1,res]
[2,tr]
[3,677]
[4,cv]  

map2=[1,res]
[2,cd]
[3,677]
[4,fs]

It should return me 它应该还我

true
false
true
false

Here's a method that generates a Map of the results (Map of key to boolean). 这是一种生成结果映射(将键映射为布尔值的映射)的方法。 It will play nicely regardless of different keys and key sort order: 无论键和键排序顺序如何,它都能很好地播放:

/**
 * Works with any two maps with common key / value types.
 * The key type must implement Comparable though (for sorting).
 * Returns a map containing all keys that appear in either of the supplied maps.
 * The values will be true if and only if either
 *   - map1.get(key)==map2.get(key) (values may be null) or
 *   - map1.get(key).equals(map2.get(key)).
 */
public static <K extends Comparable<? super K>, V>
Map<K, Boolean> compareEntries(final Map<K, V> map1,
    final Map<K, V> map2){
    final Collection<K> allKeys = new HashSet<K>();
    allKeys.addAll(map1.keySet());
    allKeys.addAll(map2.keySet());
    final Map<K, Boolean> result = new TreeMap<K, Boolean>();
    for(final K key : allKeys){
        result.put(key,
            map1.containsKey(key) == map2.containsKey(key) &&
            Boolean.valueOf(equal(map1.get(key), map2.get(key))));
    }
    return result;
}

private static boolean equal(final Object obj1, final Object obj2){
    return obj1 == obj2 || (obj1 != null && obj1.equals(obj2));
}

Usage: 用法:

public static void main(final String[] args){
    final Map<Integer, String> map1 = new HashMap<Integer, String>();
    map1.put(1, null);
    map1.put(2, "Different");
    map1.put(3, "Same");
    map1.put(4, "First Map only");
    final Map<Integer, String> map2 = new HashMap<Integer, String>();
    map2.put(3, "Same");
    map2.put(1, null);
    map2.put(2, "Yup, different");
    map2.put(5, "Second Map only");
    final Map<Integer, Boolean> comparisonResult =
        compareEntries(map1, map2);
    for(final Entry<Integer, Boolean> entry : comparisonResult.entrySet()){
        System.out.println("Entry:" + entry.getKey() + ", value: "
            + entry.getValue());
    }

}

Output: 输出:

Entry:1, value: true 条目:1,值:true
Entry:2, value: false 条目:2,值:false
Entry:3, value: true 条目:3,值:true
Entry:4, value: false 条目:4,值:false
Entry:5, value: false 条目:5,值:false

I was directed here from this (possibly duplicate) question and was surprised to find that Google Guava wasn't mentioned in the answers. 我是从这个(可能是重复的)问题直接带到这里的,很惊讶地发现答案中没有提到Google Guava

Instead of re-inventing the wheel, use the handy the Maps.difference method. 不用重新发明轮子,而是使用方便的Maps.difference方法。

Assuming that you have the same entry sets: 假设您具有相同的条目集:

import java.util.HashMap;
import java.util.Map.Entry;

public class HashMapComparison {

    public static void main(String[] args) {

        HashMap<Integer, String> map1 = new HashMap<Integer, String>();
        map1.put(1, "res");
        map1.put(2, "tr");

        HashMap<Integer, String> map2 = new HashMap<Integer, String>();
        map2.put(1, "res");
        map2.put(2, "cd");

        for (Entry<Integer, String> entry : map1.entrySet()) {
            Integer key = entry.getKey();
            System.out.println("key " + key + ": "
                    + entry.getValue().equals(map2.get(key)));
        }

    }

}

You can take keys of one map (with keySet() method), iterate through them, get values from both maps (with get() method), and compare them. 您可以获取一个映射的键(使用keySet()方法),对其进行迭代,从两个映射中获取值(使用get()方法),然后进行比较。

Also, you can use values() method to get all key-value pairs form one map, iterate through it and compare values with values from another map. 另外,您可以使用values()方法来获取一张地图中的所有键值对,对其进行迭代,然后将值与另一张地图中的值进行比较。

Pseudo Code: 伪代码:

HashMap map1;
HashMap map2;
HashMap resultMap;
for(KeyType key : map1.keySet() ) {
  if(map1.get(key).equals(map2.get(key)){
    resultMap.put(key,true);
  } else {
    resultMap.put(key,false);
  }   

} }

Map map = new HashMap();
map.put("AA","aaa");
map.put("BB","bbb");
map.put("CC","ccc");
map.put("DD","ddd");

Map map2 = new HashMap();
map2.put("BB","bbb");
map2.put("AA","aaa");
map2.put("DD","ddd");
map2.put("CC","ccc");

if(map.equals(map2))
{
    System.out.println("Eql");
}
else
{
    System.out.println("Not");
}

use: 使用:

mapA.equals(mapB);

This will give back a boolean result. 这将返回布尔结果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM