4

私はまだJavaに比較的慣れていないので、もう少し単純なはずだと思うこのコードを適切に記述しようと努力していることに気づいています。

同じオブジェクトの2つの異なるインスタンスで構成される2つのマップがあります。キーはオブジェクトであり、値はオブジェクトです。

あるインスタンスのキーが別のインスタンスのキーと異なるかどうかを判断しようとしているため、2つのインスタンスがあります。新しいキーまたは欠落しているキーを具体的に見つけて、両方のマップに存在するキーの値を比較しようとしています。

以下のサンプルコードは、私がやろうとしていることを視覚化するのに役立つだけです(もっと混乱しないことを願っています!)

以下の例の目標は、キー "C"が欠落していて、新しいキー( "D")があることを示し、最終的に両方のマップのキーの値を比較する必要があります。

主な質問は、これを1つのループで実行する方法はありますか?主な理由は、実際のコードがマップ内の値についてファイルシステムにアクセスし、ディスクにアクセスする時間を最小限に抑えようとしているためです。

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");
    }
}
4

2 に答える 2

11

aのキーMapSetsであるため、セットとそれらに対して使用可能な操作を使用できます。

例えば:

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)の実装を確認する必要があります。

于 2012-12-25T00:56:04.147 に答える
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);
于 2012-12-25T00:58:57.487 に答える