如何根据键集获得两个映射的差异?

sna*_*ggs 1 java collections map set-difference

我有两张地图:

Map<String, Sample> newMap = convertJSONObjectToSampleMap(newMapStr);
Map<String, Sample> oldMap = convertJSONObjectToSampleMap(oldMapStr);
Run Code Online (Sandbox Code Playgroud)

Sample是一些自定义类

newMap有键:[1,2,3,4,5]oldMap具有键:[2,3,4,5,8]

什么是获得它们之间差异的最佳方式,.e,Sample用键获得:18

我想用Collections并提取Set<>:

Set<String> newSet = newMap.keySet();
Set<String> oldSet = oldMap.keySet();
Run Code Online (Sandbox Code Playgroud)

谢谢,

Ale*_* C. 6

你想要什么称为对称差异.

在此输入图像描述

番石榴提供了这样一种方法.

Set<String> diff = Sets.symmetricDifference(newSet, oldSet);
Run Code Online (Sandbox Code Playgroud)

然后只需遍历集合获取样本.

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

您也可以使用官方API来实现,基本上对称差异是联合减去两组的交集,但为什么要重新发明轮子呢?

如果你只使用一种方法,那么使用外部依赖可能会很糟糕,但是Guava提供了许多有用的功能.

  • @ErickRobertson肯定你可以用官方的JDK来做,但是Guava真的是必须的,我没有看到没有使用外部库来做这类事情的任何理由. (2认同)