java - 如何获得两个 map Java之间的差异?

标签 java collections set

我有两张 map 如下:

Map<String, Record> sourceRecords;
Map<String, Record> targetRecords;

我想获得与每个 map 不同的键。即

  1. 它显示在 sourceRecords 中可用但在 targetRecords 中不可用的映射键。
  2. 它显示了 targetRecords 中可用但 sourceRecords 中不可用的映射键。

我是这样做的:

Set<String> sourceKeysList = new HashSet<String>(sourceRecords.keySet());
Set<String> targetKeysList = new HashSet<String>(targetRecords.keySet());

SetView<String> intersection = Sets.intersection(sourceKeysList, targetKeysList);
Iterator it = intersection.iterator();
while (it.hasNext()) {
    Object object = (Object) it.next();
    System.out.println(object.toString());
}

SetView<String> difference = Sets.symmetricDifference(sourceKeysList, targetKeysList);
ImmutableSet<String> immutableSet = difference.immutableCopy();

编辑

if(sourceKeysList.removeAll(targetKeysList)){
            //distinct sourceKeys
            Iterator<String> it1 = sourceKeysList.iterator();
            while (it1.hasNext()) {
                String id = (String) it1.next();
                String resultMessage = "This ID exists in source file but not in target file";
                System.out.println(resultMessage);
                values = createMessageRow(id, resultMessage);
                result.add(values);
            }
        }
        if(targetKeysList.removeAll(sourceKeysList)){
            //distinct targetKeys
            Iterator<String> it1 = targetKeysList.iterator();
            while (it1.hasNext()) {
                String id = (String) it1.next();
                String resultMessage = "This ID exists in target file but not in source file";
                System.out.println(resultMessage);
                values = createMessageRow(id, resultMessage);
                result.add(values);
            }
        }

我能够找到通用键但不能找到不同键。请帮忙。

最佳答案

您可以使用 Guava Maps.difference(Map<K, V> left, Map<K, V> right) 方法。它返回 MapDifference 对象,它具有获取所有四种映射条目的方法:

  • 在左右 map 中均等出现
  • 只在左图<​​/li>
  • 只在右图
  • key 出现在两个映射中,但具有不同的值

所以在您的情况下,只需 3 行代码即可解决:

MapDifference<String, Record> diff = Maps.difference(sourceRecords, targetRecords);
Set<String> keysOnlyInSource = diff.entriesOnlyOnLeft().keySet();
Set<String> keysOnlyInTarget = diff.entriesOnlyOnRight().keySet();

关于java - 如何获得两个 map Java之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38015282/

相关文章:

python - 如何查找输入字符串中常见字符的个数

java - 在 Java 中构建稀疏矩阵而不使用哈希表?

java - 新用户创建通知邮件不会在 Alfresco 中发送

java - Actionbar Overflow 中的单元测试菜单项

python - 默认字典的默认字典?

java - 如何在不迭代 List<Map> 的情况下获取值

java - 按索引查询 GAE 数据存储区

.net - .NET 中的有序集合和无序集合有什么区别

java - 迭代计算任意数量集合的笛卡尔积

python sympy(不等式或关系)到(设置或间隔)