2016-08-09 2 views
1

У меня есть Multimap, как показано ниже:Определение пары ключ-значение, имеющие одинаковые значения

{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 и просматривать в виде карты, перебирать его записей:

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]} 
Смежные вопросы