Java 标识具有重复值的键值对

Java 标识具有重复值的键值对,java,hashmap,guava,multimap,Java,Hashmap,Guava,Multimap,我有一个如下所示的多重映射: {20014=[13123], 20013=[45451, 13123]} {13123=[20014, 20013]} 其中键和值位于字符串中 如果其他键的值中有任何重复项,我必须打印该键-值对。在这种情况下,它将是Key-20013,Value-13123 如何做到这一点? 我对此进行了检查,但没有了解如何获取复制对。可以这样做: // Initialize my multimap Multimap<String, String> multima

我有一个如下所示的多重映射:

{20014=[13123], 20013=[45451, 13123]}
{13123=[20014, 20013]}
其中键和值位于
字符串中

如果其他键的值中有任何重复项,我必须打印该键-值对。在这种情况下,它将是Key-20013,Value-13123

如何做到这一点?
我对此进行了检查,但没有了解如何获取复制对。

可以这样做:

// Initialize my multimap
Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("20014", "13123");
multimap.put("20013", "45451");
multimap.put("20013", "13123");

// Set in which we store the values to know if they exist already
Set<String> allValues = new HashSet<>();
// Convert the multimap into a Map
Map<String, Collection<String>> map = multimap.asMap();
// Iterate over the existing entries
for (Map.Entry<String, Collection<String>> entry : map.entrySet()) {
    String key = entry.getKey();
    Collection<String> values =  entry.getValue();
    // Iterate over the existing values for a given key
    for (String value : values) {
        // Check if the value has already been defined if so print a log message
        if (!allValues.add(value)) {
            System.out.println(String.format("Key-%s,Value-%s", key, value));
        }
    }
}

您可以反转多重贴图,并将其视为贴图,遍历其条目:

Multimap<String, String> inverse = Multimaps.invertFrom(multimap, HashMultimap.create());
for (Map.Entry<String, Collection<String>> entry : inverse.asMap().entrySet()) {
    String value = entry.getKey();
    Iterator<String> keysIterator = entry.getValue().iterator();
    assert keysIterator.hasNext() : "there is always at least one key";
    keysIterator.next(); // skip first key
    while (keysIterator.hasNext()) { // each additional key is a duplicate
        String key = keysIterator.next();
        System.out.println(String.format("Key-%s,Value-%s", key, value));
    }
}
如果您使用的是,那么您可以简单地使用:

这将为您提供如下地图:

{20014=[13123], 20013=[45451, 13123]}
{13123=[20014, 20013]}

哪个多重地图?番石榴一号?是的番石榴一号。为什么不是键-20014,值-13123?在我的情况下,键和值都是重复的?我如何获取重复的一对(包括键和值)
Map<String, Collection<String>> keysByDuplicatedValue = Maps.filterValues(inverse.asMap(),
        keys -> keys.size() > 1);
{13123=[20014, 20013]}