在Java中使用带有字符串和整数的HashMap时遇到问题

时间:2013-02-18 04:58:54

标签: java string hashmap

我正在研究一个涉及字符串的非常常见的Java问题的解决方案。我想写一个方法来查看字符串是否是另一个字符串的排列(anagram)。

我的解决方案是:我正在编写一个需要两个字符串的方法。我遍历一个String并将找到的字符放入HashMap,其中键是字母,值是该字母的出现次数,作为int。一旦我完成迭代第一个String,我迭代第二个String并减少在同一个HashMap中找到的每个字符的值。

一旦键达到零,我将从HashMap中完全删除键/值对。一旦我完成迭代第二个String,我就只检查HashMap是否为空。如果是,则两个字符串是彼此的排列/字谜,否则该方法返回false。

我的方法如下:

public boolean checkPermutation (String stringA, String stringB) {

        if (stringA.length() != stringB.length()) {

            return false;

        }

        else {


        HashMap alpha = new HashMap();

        for (int i = 0; i < stringA.length(); i++) {

            if (!alpha.containsKey(stringA.charAt(i))) {

                alpha.put(stringA.charAt(i), 0);
            }

            else {

                Integer value = (Integer) alpha.get(stringA.charAt(i));
                int newValue = value.intValue();
                alpha.put(stringA.charAt(i), newValue++);

            }

        }

        for (int j = 0; j < stringB.length(); j++) {

            if (alpha.containsKey(stringB.charAt(j))) {

                Integer value = (Integer) alpha.get(stringA.charAt(j));
                int newValue = value.intValue();//null pointer exception here

                if (newValue > 1) {

                    alpha.put(stringB.charAt(j), newValue--);

                }

                else {

                    alpha.remove(stringB.charAt(j));

                }

            }

        }

        if (alpha.isEmpty())
            return true;

        else
            return false;


        }
    }

我的问题是我的解决方案区分大小写(即如果我输入“Hello”和“oellH”,我会得到一个空指针异常)。我想让这个解决方案不区分大小写,并弄清楚为什么我得到一个空指针异常。谁能看到我做错了什么?

作为一个小的后续问题,尽管存在两个for循环,但这种O(n)类型的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

Integer value = (Integer) alpha.get(stringA.charAt(j));

尝试将stringA更改为stringB。

Integer value = (Integer) alpha.get(stringB.charAt(j));

因为如果给出不同的字符串,其中没有相同的字符,则该值将为null,并且将通过NPE。

将两个字符串更改为小写或大写。

stringA= stringA.toLowercase();
stringB= stringB.toLowercase();

答案 1 :(得分:1)

抛出空指针异常,因为您正在检查hashmap中stringB的char,然后提取stringA的值,可能有可能在此时从hashmap中删除该特定值时抛出空指针错误。

如果您在

中仔细调试代码
if (alpha.containsKey(stringB.charAt(j))) {
    Integer value = (Integer) alpha.get(stringA.charAt(j));
 ///Your code
}

将其更改为

if (alpha.containsKey(stringB.charAt(j))) {
    Integer value = (Integer) alpha.get(stringB.charAt(j));
///Your code
}

对于你的另一个问题,使它不区分大小写,在开始操作之前将小写字母大小写为大写

stringA = stringA.toLowerCase();
stringB = stringB.toLowerCase();