2016-08-09 158 views
1

的鍵 - 值對我有多重映射象下面這樣:識別具有重複值

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

,其中鍵和值在String

如果在從其他鍵的值的任何重複,我必須打印該鍵值對。在這種情況下,它將是Key-20013,Value-13123。

如何實現這一目標? 我檢查了這個link但沒有得到如何獲得重複對。

+0

其中Multimap?番石榴一個? –

+0

是的番石榴一個。 – Leo

+0

爲什麼不是鍵-20014,值13123? – Henry

回答

2

這是可以做到這樣的:

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

輸出:

Key-20013,Value-13123 
1

您可以反你的多重映射,並看作是一個地圖,通過其輸入迭代:

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

輸出:

Key-20013,Value-13123 

如果您使用的是ImmutableMultimap然後代替Multimaps.invertFrom(Multimap, M),你可以簡單地使用ImmutableMultimap.inverse()

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

如果你只是想重複值的地圖,以各自的密鑰,那麼你可以使用Maps.filterValues(Map, Predicate)

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

,這將給你一個地圖象下面這樣:

{13123=[20014, 20013]}