【问题标题】:Iterate Over 2 Maps in Java在 Java 中迭代 2 个地图
【发布时间】:2020-06-29 16:46:14
【问题描述】:

从 CodeSignal 执行 commonCharacterCount。当然是想看看有多少 Character 是相同的。

这是一个例子:

对于s1 = "aabcc"s2 = "adcaa",输出应该是 commonCharacterCount(s1, s2) = 3.

字符串有 3 个常用字符 - 2 个“a”和 1 个“c”。

关于构建一个包含每个字符数的地图的想法。然后我想检查地图中的每个值,并检查它们。对于答案,我将在两个地图中添加字符的最小计数。 例如, s1 = "aabcc" && s2 = "adcaa", mapS1['a'] = 2 && mapS2['a'] = 3, 所以count += min(2,3) = 2

这是我的想法,但正如我提到的那样,在迭代两个地图时遇到了一些问题。

第一次使用地图的值作为计数值。无法确定这是否是在地图中增加值的最佳方式,所以我想我也需要帮助。

提前谢谢你:)

static int res(String s1, String s2) {
                HashMap<Character, Integer> mapS1 = new HashMap<>();
                HashMap<Character, Integer> mapS2 = new HashMap<>();
                int count = 0;

                for(int i = 0; i < s1.length(); i++) 
                        mapS1.put(s1.charAt(i), mapS1.getOrDefault(s2.charAt(i), 0) + 1);

                for(int i = 0; i < s2.length(); i++) 
                        mapS1.put(s2.charAt(i), mapS2.getOrDefault(s2.charAt(i), 0) + 1);

                for(Map.Entry<Character, Integer> entry : mapS1.entrySet()) {
                        int a = mapS1.get(entry.getKey());
                        int b = mapS2.get(entry.getKey());

                        if(a > 0 && b >= 0) count += Math.min(a, b);
                } 

                return count;
}

更正和有效的版本:谢谢大家!

static int res(String s1, String s2) {
                HashMap<Character, Integer> mapS1 = new HashMap<>();
                HashMap<Character, Integer> mapS2 = new HashMap<>();
                int count = 0;

                for(int i = 0; i < s1.length(); i++)
                        mapS1.put(s1.charAt(i), mapS1.getOrDefault(s1.charAt(i), 0) + 1);
                for(int i = 0; i < s2.length(); i++)
                        mapS2.put(s2.charAt(i), mapS2.getOrDefault(s2.charAt(i), 0) + 1);

                for(Map.Entry<Character, Integer> entry : mapS1.entrySet()) {
                        int a = mapS1.getOrDefault(entry.getKey(), 0);
                        int b = mapS2.getOrDefault(entry.getKey(), 0);
                        System.out.println(a + " " + b);
                        count += Math.min(a, b);
                }

                return count;
        }
```


【问题讨论】:

  • 你的方法对我来说看起来不错。您具体面临的问题是什么?
  • 应该对我的问题提供更多信息,对此感到抱歉。在我的 int b 初始化中获取 NullPointerException
  • 尝试使用getOrDefault(entry.getKey(), 0) 代替get()。给定键没有任何值,它返回 null 然后尝试将其分配给 int 变量,这是不可能的,因此是 NPE。
  • 成功了!非常感谢,正是我需要的:)

标签: java dictionary iterator


【解决方案1】:

您的代码中有两个问题。首先,“不太重要”的是复制粘贴错误。在第二个循环中,您再次向mapS1 添加元素,我相信它应该是mapS2

正如您在评论中提到的,主要问题是您在这一行中遇到的 NullPointerException:

int b = mapS2.get(entry.getKey());

这是因为如果给定键没有任何值,它会返回null。那么null 应该被分配给b,这是一个intint 变量不接受空值,因此抛出 NPE。如果不存在任何映射,最简单的解决方案是返回默认值。你可以这样做:

int b = mapS2.getOrDefault(entry.getKey(), 0);

【讨论】:

  • 这正是我遇到的所有问题,因此将其标记为最完整的答案:)。太感谢了!一切正常运行 rn :)
【解决方案2】:

我认为你这里有一个错误:

 for(int i = 0; i < s2.length(); i++) 
        mapS1.put(...); //<------ should be mapS2.put?

【讨论】:

  • 我猜第一个循环中的 s2.charAt(i) 也不正确,应该改为 s1。在 s1 和 s2 以及 mapS1/mapS2 的循环中存在相当大的混淆。
  • 是的,我在那里犯了很多错误。复制粘贴和分心的问题:p 要编辑正确的版本,谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多