2016-08-09 64 views
1

Ich habe einen multimap wie unten:Identifizieren des Schlüsselwertpaar mit doppelten Werten

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

wo die Schlüssel und Werte sind in String

Wenn es eine doppelten im Wert von anderen Schlüsseln ist, Ich muss dieses Schlüssel-Wert-Paar drucken. In diesem Fall ist es Key-20013, Value-13123.

Wie dies zu erreichen? Ich überprüfte diese link, aber nicht bekommen, wie man das doppelte Paar erhält.

+0

Welche Multimap? die Guave eins? –

+0

Ja die Guave eins. – Leo

+0

Warum nicht key-20014, Wert-13123? – Henry

Antwort

2

Es könnte wie folgt geschehen:

// 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)); 
     } 
    } 
} 

Ausgang:

Key-20013,Value-13123 
1

Sie Ihre multimap invertieren und als Karte angezeigt, durchlaufen seine Einträge:

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

Ausgabe:

Key-20013,Value-13123 

Wenn Sie eine ImmutableMultimap dann statt Multimaps.invertFrom(Multimap, M) verwenden Sie einfach ImmutableMultimap.inverse() verwenden können:

ImmutableMultimap<String, String> inverse = multimap.inverse(); 

Wenn Sie einfach eine Karte von duplizierten Werte zu den jeweiligen Tasten wollen, dann können Sie Maps.filterValues(Map, Predicate) verwenden:

Map<String, Collection<String>> keysByDuplicatedValue = Maps.filterValues(inverse.asMap(), 
     keys -> keys.size() > 1); 

Welche wird Ihnen eine Karte wie unten:

{13123=[20014, 20013]}