首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中迭代2个地图

在Java中迭代2个地图
EN

Stack Overflow用户
提问于 2020-03-18 22:57:42
回答 2查看 69关注 0票数 0

在CodeSignal中执行commonCharacterCount。当然,我想看看有多少字符是相同的。

下面是一个例子:

对于s1 = "aabcc"s2 = "adcaa",输出应为commonCharacterCount(s1, s2) = 3。

字符串有3个常见字符-2个"a"s和1个"c“。

考虑构建一个包含每个元素的字符计数的映射。然后我想检查映射中的每个值,并同时检查这两个值。对于答案,我将在两个Map中添加字符的最小计数。例如,s1 = "aabcc" && s2 = "adcaa"mapS1['a'] = 2 && mapS2['a'] = 3,因此count += min(2,3) =2

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

第一次使用贴图的值作为计数值。我真的不知道这是否是在map中增加一个值的最佳方法,所以我想我也需要帮助。

提前感谢您:)

代码语言:javascript
复制
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;
}

更正和工作版本:谢谢大家!

代码语言:javascript
复制
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;
        }
代码语言:javascript
复制
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-18 23:19:08

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

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

代码语言:javascript
复制
int b = mapS2.get(entry.getKey());

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

代码语言:javascript
复制
int b = mapS2.getOrDefault(entry.getKey(), 0);
票数 1
EN

Stack Overflow用户

发布于 2020-03-18 23:11:51

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

代码语言:javascript
复制
 for(int i = 0; i < s2.length(); i++) 
        mapS1.put(...); //<------ should be mapS2.put?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60742111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档