2014-03-08 8 views
2

Я не знаю, как можно лучше всего описать мою проблему, но здесь это, я пытаюсь удалить одни и те же имена (значения) из HashMap<String, String> map = new HashMap<String, String>();Как удалить повторяющиеся значения из HashMap

, например, если эта карта содержат имена, как

map.put("Vivaldi","Antonio"); 
    map.put("Belucci", "Monica"); 
    map.put("Gudini", "Harry"); 
    map.put("Verdo", "Dhuzeppe"); 
    map.put("Maracci", "Bruno"); 
    map.put("Carleone", "Vito"); 
    map.put("Bracco", "Luka"); 
    map.put("Stradivari", "Antonio"); 

Я хочу, чтобы удалить все записи со значением «Антонио» из него с помощью метода removeTheFirstNameDuplicates, я посмотрел в Google в течение нескольких дней, и все примеры близки к тому, что я хочу, но на самом деле не Что мне нужно.

Мои мысли, мне нужно что-то, что проверит карту, и если в ней будут одинаковые значения, удалите дубликат. Но как я могу это сделать?

+1

[Итерация над записями] (http://stackoverflow.com/a/46905/2071828) и удалить те, которые вам не нравятся. –

+0

Ваша карта, вероятно, должна быть обращена вспять и быть «Map >», где ключи являются первыми именами, а значения - это списки имен. Для чего вы используете эту карту? Вы уверены, что вместо этого вы не должны иметь «Список »? –

+0

Это метод, который создает карту имен –

ответ

2

Вы можете сделать это с помощью следующего метода, который только перебирает карты один раз:

private static void removeTheFirstNameDuplicates(final Map<String, String> map) { 
    final Iterator<Entry<String, String>> iter = map.entrySet().iterator(); 
    final HashSet<String> valueSet = new HashSet<String>(); 
    while (iter.hasNext()) { 
     final Entry<String, String> next = iter.next(); 
     if (!valueSet.add(next.getValue())) { 
      iter.remove(); 
     } 
    } 
} 

Способ по HashSetadd() будет возвращать false если значение уже было добавлен в набор. В приведенном выше методе используется это, чтобы обнаружить, что дубликат найден, а затем удаляет дубликат из HashMap с использованием методана итераторе.

Следует отметить, что в зависимости от используемой вами реализации Map порядок итераций не гарантируется, поэтому дублирующее удаление также не гарантируется.

Если вы должны были использовать TreeMap, а не HashMap, вы были бы уверены в том, чтобы перебирать карту по алфавиту по клавише, например. Берлуччио, Бракко, Карлеоне ... Вердо. Тогда вы всегда будете держать Страдивари и удалять Вивальди.

0

Попробуйте

ArrayList<String> values = new ArrayList<String>(); 
    ArrayList<String> keys = new ArrayList<String>(); 

    java.util.Iterator<Entry<String, String>> iterate = map.entrySet() 
      .iterator(); 
    while (iterate.hasNext()) { 
     Entry mapEntry = iterate.next(); 
     String key = (String) mapEntry.getKey(); 
     String value = (String) mapEntry.getValue(); 

     values.add(value); 
     keys.add(key); 
    } 

    for (int i = 0; i < values.size(); i++) { 
     if (Collections.frequency(values, values.get(i)) > 1) { 
      map.remove(keys.get(i)); 
     } 
    } 
    System.out.println(map.toString()); 
+0

Является ли каждый вызов 'Collections.frequency()' итерацией по всему списку? –

+0

Yup. Его на лету мышление. Может быть лучшее/более короткое решение. –

Смежные вопросы