如何在哈希图中打印具有重复值的键?

时间:2019-03-22 23:39:40

标签: java hashmap duplicates

我有一个哈希映射,其中一些键指向相同的值。我想找到所有相等的值并打印相应的键。

这是我当前拥有的代码:

    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 :(得分:0)

您可以使用流以这种方式检索重复项:

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

然后,您可以使用以下命令将其打印出来:

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

答案 1 :(得分:0)

构建一个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]

答案 2 :(得分:0)

如果您想要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());
            }
        }

    }

答案 3 :(得分:0)

我认为其他答案已经可以很好地解决该问题,我支持另一种仅用于扩展思考的方法。该方法需要使用GuavaMutliMap界面:

    // 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