1

私は2つのマップを持っています:

Map<String, Sample> newMap = convertJSONObjectToSampleMap(newMapStr);
Map<String, Sample> oldMap = convertJSONObjectToSampleMap(oldMapStr);

これSampleはいくつかのカスタムクラスです

newMapはキーがあります:[1,2,3,4,5]oldMapはキーがあります:[2,3,4,5,8]

それらの違いを取得する最良の方法は何ですか.e, get Samples with keys:18?

私は使用Collectionsして抽出することを考えましたSet<>:

Set<String> newSet = newMap.keySet();
Set<String> oldSet = oldMap.keySet();

ありがとうございました、

4

3 に答える 3

6

あなたが望むものは、対称差と呼ばれます。

ここに画像の説明を入力

Guava はそのような方法を提供します。

Set<String> diff = Sets.symmetricDifference(newSet, oldSet);

次に、セットを反復してサンプルを取得します。

List<Sample> samples = new ArrayList<>();
for(String key : diff){
    if(oldMap.containsKey(key)){
        samples.add(oldMap.get(key));
    } else {
        samples.add(newMap.get(key));
    }
}

公式 API を使用して行うこともできます。基本的に対称的な違いは、結合から両方のセットの交点を引いたものですが、なぜ車輪を再発明するのでしょうか?

1 つのメソッドのみを使用している場合、外部依存関係を使用するのは良くありませんが、Guava には必須の便利な機能が多数用意されています。

于 2014-05-03T14:26:58.200 に答える
2

キーのみに関心がある場合は、次のような関数を使用します。

public static Set<String> getDiff(Map<String,Object> mapA, Map<String,Object> mapB) {
    Set<String> diff = mapA.keySet();
    for (String s: mapB.keySet()) {
        if (diff.contains(s))
            diff.remove(s);
        else
            diff.add(s);
    }
    return diff;
}

完全な差分マップには次の関数を使用します (既存の Map オブジェクトには影響しません)。

public static Map<String,Object> getDiff(Map<String,Object> mapA, Map<String,Object> mapB) {
   Map<String,Object> diff = new HashMap<String,Object>();
   diff.putAll(mapA);
   for (String s: mapB.keySet()) {
       if (diff.containsKey(s))
           diff.remove(s);
       else
           diff.put(s, mapB.get(s));
   }
   return diff;
}
于 2014-05-03T14:38:57.083 に答える
2

1 つのマップをループして比較します。

O(n)マップの 1 つをループするだけです。次のコードを検討してください。

for (String key: oldMap.keySet()) {
    if (newMap.containsKey(key))
        newMap.remove(key);
    else
        newMap.put(key, oldMap.get(key));
}

newMapは、両方のセットからの一意のエントリのみが含まれるようになりました。キーと値が提供されるため、すべてのデータが 1 か所にあります。マップの 1 つのキーをループするだけでよく、セットを作成する必要がないため、高速です。

于 2014-05-03T14:28:06.100 に答える