【问题标题】:Having trouble using a HashMap with Strings and ints in Java在 Java 中使用带有字符串和整数的 HashMap 时遇到问题
【发布时间】:2013-02-18 04:58:53
【问题描述】:

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

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

一旦键达到零,我就从 HashMap 中完全删除键/值对。一旦我完成了对第二个字符串的迭代,我就只检查 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)?

【问题讨论】:

  • (您可能已经意识到这一点,但在这个问题中与 cmets 相关的是它不是家庭作业 - 没关系。在 Stack Overflow 上非常欢迎家庭作业问题,只要它们是新颖的并进行了研究。如果您的问题源于学术任务,那会很好)。

标签: java string hashmap


【解决方案1】:
Integer value = (Integer) alpha.get(stringA.charAt(j));

尝试将 stringA 更改为 stringB。

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

因为如果你给不同的字符串,其中没有相同的字符,值将为空,它将通过 NPE。

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

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

【讨论】:

  • 非常感谢您指出这一点,我现在真的觉得自己很愚蠢 :-) 现在有办法让我不区分大小写吗?
【解决方案2】:

抛出空指针异常是因为您在 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2015-01-03
    • 2015-01-27
    • 1970-01-01
    相关资源
    最近更新 更多