Java 如何在hashmap中打印具有重复值的键?

Java 如何在hashmap中打印具有重复值的键?,java,hashmap,duplicates,Java,Hashmap,Duplicates,我有一个hashmap,其中一些键指向相同的值。我想找到所有相等的值并打印相应的键 这是我拥有的当前代码: 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", "

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

这是我拥有的当前代码:

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

    }
Map Map=newhashmap();
地图。放置(“你好”,“0123”);
地图放置(“hola”,“0123”);
地图放置(“kosta”,“0123”);
地图放置(“da”、“03”);
地图放置(“notda”、“013”);
地图放置(“twins2”、“01”);
地图放置(“twins22”、“01”);
List myList=new ArrayList();
对于(Map.Entry:Map.entrySet()){
对于(Map.Entry entry2:Map.entrySet()){
if(entry.getValue().equals(entry2.getValue()))
{
添加(entry.getKey());
}
}
}
当前代码将重复项添加到列表中两次,但也会将每个键添加一次


谢谢。

您可以通过以下方式使用流检索副本:

  List<String> myList = map.stream()
     .filter(n -> Collections.frequency(map.values(), n) > 1)
     .collect(Collectors.toList());
构建一个
地图
,即
地图

范例

如果没有
过滤器()
,结果将是:

01=[twins22,twins2]
013=[notda]
03=[da]
0123=[kosta,你好,hola]

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

    }
publicstaticvoidduplicatedValuesMap(){
Map Map=newhashmap();
地图。放置(“你好”,“0123”);
地图放置(“hola”,“0123”);
地图放置(“kosta”,“0123测试”);
地图放置(“da”、“03”);
地图放置(“notda”、“013”);
地图放置(“twins2”、“01”);
地图放置(“twins22”、“01”);
HashMap valueToKeyMapCounter=新HashMap();
对于(Map.Entry:Map.entrySet()){
if(valueToKeyMapCounter.containsKey(entry.getValue())){
获取(entry.getValue()).add(entry.getKey());
}否则{
列表键=新的ArrayList();
key.add(entry.getKey());
valueToKeyMapCounter.put(entry.getValue(),键);
}
}
对于(Map.Entry country:valueToKeyMapCounter.entrySet()){
if(counterEntry.getValue().size()>1){
System.out.println(“复制值:”+counterEntry.getKey()+”,对于键:“+counterEntry.getValue()”);
}
}
}

我认为其他答案已经很好地解决了这个问题,我支持另一种方法来进行扩展思考。这种方法需要使用的
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);
//初始化输入映射
Map Map=newhashmap();
地图。放置(“你好”,“0123”);
地图放置(“hola”,“0123”);
地图放置(“kosta”,“0123”);
地图放置(“da”、“03”);
地图放置(“notda”、“013”);
地图放置(“twins2”、“01”);
地图放置(“twins22”、“01”);
//交换输入映射的键和值,因为不同的键具有相同的值
//所以我们需要多重映射
Multimap容器=ArrayListMultimap.create();
map.entrySet().forEach(entry->container.put(entry.getValue(),entry.getKey());
container.keySet().stream()
.filter->container.get.size()>1)。
forEach(System.out::println);
输出:
01

0123

迭代每个条目。将该值添加到新集合中,如果该值已包含在其中,请检查。这保证了运行时为O(n)。如果您关心性能,最好使用另一个HashMap将值存储为映射到数组的键或原始HashMap中的键列表。
    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());
            }
        }

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