比较两个java映射的键和值

时间:2012-12-25 00:50:55

标签: java map comparison

我仍然相对较新的Java,我发现自己仍然试图正确编写这段代码,我觉得应该更简单一些。

我有两个由同一个对象的两个不同实例组成的地图。键是对象,值是对象。

有两个实例,因为我试图确定一个实例中的键是否与另一个实例中的键不同。我正在尝试专门定位新密钥或丢失密钥,然后比较两个映射中存在的密钥的值。

下面的示例代码只是为了帮助想象我想要做的事情(希望它不会让人感到困惑!)

以下示例的目标应该告诉我缺少关键字“C”并且有一个新密钥(“D”)然后它应该最终比较两个映射中的键值。

主要问题是,无论如何都要在一个循环中执行此操作?主要是因为我的实际代码将触摸文件系统中的地图中的值,我正在尝试最小化它触摸磁盘的时间

Map<objA, objB> mapA = new HashMap<objA, objB>();
mapA.put("A", "1");
mapA.put("B", "2");
mapA.put("C", "3");

Map<objA, objB> mapB = new HashMap<objA, objB>();
mapB.put("A", "1");
mapB.put("D", "4");

// Check if something is missing from mapB
for(Map.Entry<objA, objB> entryMapA:mapA.entrySet())
{
    if(!mapB.containsKey(entryMapA.getKey())
        {
            System.out.println(entryMapA.getKey() + " is missing");
        }
}

// Check if something is new is in mapB
for(Map.Entry<objA, objB> entryMapB:mapB.entrySet())
{
    if(!mapA.containsKey(entryMapB.getKey())
    {  
        System.out.println(entryMapB.getKey() + " is new");
    }
}

2 个答案:

答案 0 :(得分:9)

Map中的密钥为Set,因此您可以使用集合及其可用操作。

例如:

Set<String> keysInA = new HashSet<String>(mapA.keySet());
Set<String> keysInB = new HashSet<String>(mapB.keySet());

// Keys in A and not in B
Set<String> inANotB = new HashSet<String>(keysInA);
inANotB.removeAll(keysInB);

// Keys common to both maps
Set<String> commonKeys = new HashSet<String>(keysInA);
commonKeys.retainAll(keysInB);

等等。

注意:您不得直接使用地图的密钥集。如果你这样做:

// This returns the actual key set of the map, NOT a copy!
Set<String> inANotB = mapA.keysSet();
inANotB.removeAll(mapB.keySet())

您实际上删除mapA 中的密钥(及其相关值)。

最后,您应该注意HashSet没有订单保证。如果这对您很重要,您希望查看SortedSet的实施(例如TreeSet)。

答案 1 :(得分:1)

您可以减去键集:

Set<objA> keysA1 = new HashSet<objA>(mapA.keySet()); // deepcopy
Set<objA> keysA2 = new HashSet<objA>(mapA.keySet()); // deepcopy
Set<objB> keysB = new HashSet<objB>(mapB.keySet()); // deepcopy

keysA1.removeAll(keysB);
keysB.removeAll(keysA2);

System.out.println("Missing in A: " + keysB);
System.out.println("Missing in B: " + keysA1);