【问题标题】:How to compare two maps by both key and value and storing difference map in resultant map如何通过键和值比较两个映射并将差异映射存储在结果映射中
【发布时间】:2014-02-04 17:54:39
【问题描述】:

假设我有两张地图:

Map mapA = new HashMap();
Map mapB = new HashMap();

mapA.put("JEETENDRA", "24");
mapA.put("AHUJA", "24"); --1A
mapA.put("AHUJA", "25");---2A
mapA.put("PAL", "24");

mapB.put("AHUJA", "24");
mapB.put("JEETENDRA", "24");---1B
mapB.put("PAL", "24");

现在我想通过键和值来比较这两个地图,因为 2A 和 1A 具有共同的键。 理想情况下,我知道它是错误的,因为键对于 map 应该是唯一的,但是在代码中我正在检索两列记录并将其存储为 map。

MapA 在操作之前。
MapB 经过一些操作。

【问题讨论】:

  • mapA 不存在,因此无法检查。
  • 您确实意识到值 1A 将被删除。 javadocs read "将指定值与此映射中的指定键关联。如果映射先前包含键的映射,则替换旧值。" -- 您可能需要考虑嵌套数据结构,例如 Map<String, Set<String>> 来存储与单个键关联的多个值。
  • mapA 只有一个键“AHUJA”的条目,因为现有键的值在put 上被覆盖。
  • 你能推荐合适的收藏,我可以使用,我不想专门使用谷歌的 Guava 库。谢谢大佬!!!
  • 这个问题真的没有意义。您想比较两张地图并存储“结果”,但您从不指明是什么比较。此外,您违反了其他人指出的基本地图行为(地图中不存在“1A”,根据您的代码,“AHUJA”的值仅为“25”)。您注意到这是“理想错误”(这不仅是理想错误,而且实际上是错误的),但没有做出任何调整或为此或解释您想要什么。

标签: java map hashmap


【解决方案1】:

你可以使用这个方法,这里我使用了泛型,我使用了一个带有名称 result 的 TreeMap 来保存两个 HashMaps 中的所有键,通过这个方法你将得到 Hashmaps 中的所有匹配对象

public static <K extends Comparable<? super K>, V>
    Map<K, Boolean> compareKeysAndValues(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;
    }

如果您想获得不同的值,只需反转结果.put 函数中的检查

【讨论】:

  • @user3271997 欢迎,如果它看起来很完美,请点击右侧标记将其标记为正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2012-07-17
相关资源
最近更新 更多