Как напечатать ключи с дублирующимися значениями в хэш-карте? - PullRequest
0 голосов
/ 23 марта 2019

У меня есть хэш-карта с некоторыми ключами, указывающими на одинаковые значения. Я хочу найти все равные значения и напечатать соответствующие ключи.

Это текущий код, который у меня есть:

    Map<String, String> map = new HashMap<>();

    map.put("hello", "0123");
    map.put("hola", "0123");
    map.put("kosta", "0123");
    map.put("da", "03");
    map.put("notda", "013");

    map.put("twins2", "01");
    map.put("twins22", "01");


    List<String> myList = new ArrayList<>();

    for (Map.Entry<String, String> entry : map.entrySet()) {
       for (Map.Entry<String, String> entry2 : map.entrySet()){
           if (entry.getValue().equals(entry2.getValue()))
           {
               myList.add(entry.getKey());
           }
       }

    }

Текущий код добавляет дубликаты два раза в список, однако он также добавляет каждый ключ один раз.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 23 марта 2019

Я думаю, что другие ответы уже хороши, чтобы решить вопрос, я поддерживаю другой метод, чтобы сделать только для расширенного мышления. Этот метод должен использовать Guava * MutliMap интерфейс:

    // init the input map
    Map<String, String> map = new HashMap<>();
    map.put("hello", "0123");
    map.put("hola", "0123");
    map.put("kosta", "0123");
    map.put("da", "03");
    map.put("notda", "013");
    map.put("twins2", "01");
    map.put("twins22", "01");

    // swap key and value of the input map,since different key has same value
    // so we need Multimap
    Multimap<String, String> container = ArrayListMultimap.create();
    map.entrySet().forEach(entry -> container.put(entry.getValue(), entry.getKey()));

    container.keySet().stream()
        .filter(s -> container.get(s).size() > 1).
        forEach(System.out::println);

вывод:
01
0123

0 голосов
/ 23 марта 2019

Построить Map<VALUE, List<KEY>>, то есть Map<String, List<String>>.

Пример

Map<String, String> map = new HashMap<>();
map.put("hello", "0123");
map.put("hola", "0123");
map.put("kosta", "0123");
map.put("da", "03");
map.put("notda", "013");
map.put("twins2", "01");
map.put("twins22", "01");

map.entrySet().stream()
   .collect(Collectors.groupingBy(Entry::getValue,
               Collectors.mapping(Entry::getKey, Collectors.toList())))
   .entrySet().stream()
   .filter(e -> e.getValue().size() > 1)
   .forEach(System.out::println);

выход

01=[twins22, twins2]
0123=[kosta, hello, hola]

Без filter() результат будет:

01=[twins22, twins2]
013=[notda]
03=[da]
0123=[kosta, hello, hola]
0 голосов
/ 23 марта 2019

Если вы хотите найти решение помимо Stream API;

    public static void duplicatedValuesMap() {
        Map<String, String> map = new HashMap<>();

        map.put("hello", "0123");
        map.put("hola", "0123");
        map.put("kosta", "0123 test");
        map.put("da", "03");
        map.put("notda", "013");
        map.put("twins2", "01");
        map.put("twins22", "01");

        HashMap<String, List<String>> valueToKeyMapCounter = new HashMap<>();

        for (Map.Entry<String, String> entry : map.entrySet()) {
            if (valueToKeyMapCounter.containsKey(entry.getValue())) {
                valueToKeyMapCounter.get(entry.getValue()).add(entry.getKey());
            } else {
                List<String> keys = new ArrayList<>();
                keys.add(entry.getKey());
                valueToKeyMapCounter.put(entry.getValue(), keys);
            }
        }
        for (Map.Entry<String, List<String>> counterEntry : valueToKeyMapCounter.entrySet()) {
            if (counterEntry.getValue().size() > 1) {
                System.out.println("Duplicated Value:" + counterEntry.getKey() + " for Keys:" + counterEntry.getValue());
            }
        }

    }
0 голосов
/ 23 марта 2019

Вы можете использовать потоки для извлечения дубликатов следующим образом:

  List<String> myList = map.stream()
     .filter(n -> Collections.frequency(map.values(), n) > 1)
     .collect(Collectors.toList());

И затем вы можете распечатать это с помощью:

myList.foreach(System.out::println);
...