【问题标题】:Java from 2 hashmap print key for which value does not matchJava 来自 2 hashmap 打印键的值不匹配
【发布时间】:2020-06-15 02:31:17
【问题描述】:

下面的代码不起作用。我可以使用什么逻辑来打印在 2 个哈希映射中具有 2 个不同值的键 Job?

public void randomTest() throws IOException {

        HashMap<String, String> map1 = new HashMap<>();
        HashMap<String, String> map2 = new HashMap<>();

        map1.put("Name", "Jones");
        map1.put("Job", "QAE");

        map2.put("Name", "Jones");
        map2.put("Job", "Developer");

        // ArrayList<String> ar = new ArrayList<>();
        Set<String> hs = new HashSet<>();
        for (Map.Entry<String, String> mm1 : map1.entrySet()) {
            hs.add(mm1.getValue());
        }
        for (Map.Entry<String, String> mm2 : map1.entrySet()) {
            hs.add(mm2.getValue());
        }

        for(String s: hs){
            System.out.println(s);
        }
       /* for (Map.Entry<String, String> mm1 : map1.entrySet()) {
            for(String str: hs){
               if(str.equals(mm1.getValue())){
                   System.out.println(mm1.getKey());
               }
            }
        }*/

    }

预期输出:作业。

提前感谢您的宝贵时间。

【问题讨论】:

    标签: java hashmap key


    【解决方案1】:

    这个逻辑完成了工作(没有双关语)。

        HashMap<String, String> map1 = new HashMap<>();
        HashMap<String, String> map2 = new HashMap<>();
    
        map1.put("Name", "Jones");
        map1.put("Job", "QAE");
    
        map2.put("Name", "Jones");
        map2.put("Job", "Developer");
    
        Set<String> hs = new HashSet<>();
        for (Map.Entry<String, String> mm1 : map1.entrySet()) {
            String map2Value = map2.get(mm1.getKey());
            if (! Objects.equals(mm1.getValue(), map2Value)) {
                hs.add(mm1.getKey());
            }
        }
    
        for(String s: hs){
            System.out.println(s);
        }
    

    输出:

    工作

    我添加了两张地图的值的比较。此外,我正在使用 hs.add(mm1.getKey()); 而不是 hs.add(mm1.getValue()); 来打印不匹配的 key/s

    如果你愿意,这也是应用流操作的好例子。如果是这样,请使用 Oboe 答案中的代码。

    代码假定两个映射中的键相同。您可能应该检查这个假设,如果它不成立,则发出一条消息。

    【讨论】:

      【解决方案2】:

      您可以这样做:

      1. 遍历两个地图的并将它们收集到Set
      2. 对于该Set 中的每个条目,从两个映射中查询值。
      3. 比较值。确保您的代码处理给定键的其中一个映射中没有值的情况。是否考虑不匹配或异常情况取决于您。

      【讨论】:

        【解决方案3】:

        试试这些:

        map1.entrySet().stream()
                    .filter(entry -> map2.get(entry.getKey()) != null)
                    .filter(entry -> !map2.get(entry.getKey()).equals(entry.getValue()))
                    .map(Map.Entry::getKey)
                    .collect(Collectors.toList());
        

        【讨论】:

        • 喜欢。可以使用Collectors.toSet(),所以我们得到一个Set,就像问题一样。
        • 我认为你不需要在这里设置一个集合,因为键在 HashMap 中是唯一的
        • 你是完全正确的。仅当您有其他原因更喜欢Set 时才使用。就像告诉消费者不能有任何重复一样。或传递给需要 Set 的 API。
        • 我同意,Set 可能需要用于其他目的。
        猜你喜欢
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 2015-02-14
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        相关资源
        最近更新 更多