【问题标题】:how to identify duplicate values in a hashmap [duplicate]如何识别哈希图中的重复值[重复]
【发布时间】:2020-12-31 08:03:21
【问题描述】:

有什么简单的方法可以识别HashMap 中的重复值吗?

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

map.put(1, "a");
map.put(2, "a");
map.put(3, "b");

我想将重复值保存在名为String duplicate 的变量中。 我想要输出a

谢谢大家的帮助,我会试试你的建议。谢谢!

【问题讨论】:

  • 如果发现多个重复项怎么办?比如aabbcc?
  • 目标是:在地图中只留下一个“a”、“b”、“c”。完全没有重复
  • 这能回答你的问题吗? How to remove duplicate values from a HashMap
  • @alvira 您说您只想识别重复项,而不是删除它们。删除它们的问题是您没有指定如何决定要保存哪些密钥,或者它是否重要。
  • 你是对的 WJS。键无关紧要。

标签: java hashmap duplicates


【解决方案1】:

试试这个。

Map<Integer, String> map = Map.of(1, "a", 2, "b", 3, "b", 4,
                "c", 5, "a", 6, "a", 7, "v");
  • 获取所有值的集合。
  • 遍历该集合的集合,删除遇到的每个值的第一个。这只会留下集合中的重复项。
  • 然后将它们打印成一组显示重复项。
Collection<String> all = map.values();
new HashSet<>(all).forEach(all::remove);

System.out.println(new HashSet<>(all));

打印

[a, b]
        

【讨论】:

  • 谢谢 WJS,我喜欢你的解决方案 :)
【解决方案2】:

为了在 Hashmap 中获取值,您需要遍历它。然后你可以简单地将它们放在 String 的 HashSet 中。如果您发现 HashSet 中已有任何值,则重复该值。

【讨论】:

    【解决方案3】:

    使用stream API,您可以执行类似的操作

    import java.util.HashMap;
    import java.util.Map;
    import java.util.function.Function;
    import java.util.stream.Collectors;
    
    //populate map here
    ....
    //print all values that occur more then 1 time
    System.out.println(map.values()
            .stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
            .entrySet()
            .stream()
            .filter(e -> e.getValue() > 1)
            .map(Map.Entry::getKey)
            .collect(Collectors.toSet()));
    

    输出

    [a]
    

    【讨论】:

    • 谢谢 rkosegi,还不知道流,但我为将来保存解决方案
    • @alvira 请注意,您应该使用 Java 8+ 才能使用流。
    【解决方案4】:

    您可以迭代地图值(首先将它们放入列表中) 并通过检查第一个和最后一个索引特定元素是否不相同来查找列表中出现多次的元素。 如果不相同,则表示该值多次出现。

    下面是使用 Java Stream 的代码。

    列表值 = 新的 ArrayList(map.values()); 设置重复项 = values.stream().filter(item -> values.indexOf(item) != values.lastIndexOf(item)).collect(Collectors.toSet());

    【讨论】:

    • 考虑到 filter() 将迭代项目一次 - O(n) 并且在过滤器的每次迭代中再次调用 indexOf() O(n)lastIndexOf - 也是 O(n) ,你刚刚达到了 N * 2N 的总复杂度 (O(n^2))
    • 是的,你是对的。我当然没有考虑性能,因为关于此类代码的用例的问题并不清楚。为了提高性能,最好先对数组进行排序,然后对列表进行一次迭代,然后将每个元素与下一个元素进行比较以查找重复项。
    猜你喜欢
    • 2021-03-15
    • 2023-04-09
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多