我对Java还是比较陌生,我发现自己一直想尝试正确编写这段我认为应该更简单的代码。

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

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

下面的示例代码只是为了帮助可视化我正在尝试做的事情(希望它不会更加令人困惑!)

以下示例的目标应该告诉我,键“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");
    }
}

最佳答案

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);

等等等

注意:您绝对不能直接使用 map 的键集。如果您这样做:
// 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)。

10-02 02:42
查看更多