私は、文字列に関する非常に一般的な Java の問題の解決に取り組んでいます。文字列が別の順列 (アナグラム) であるかどうかを確認するメソッドを書きたいと思います。
私の解決策は次のとおりです。2 つの文字列を受け取るメソッドを作成しています。1 つの String を繰り返し処理し、見つかった文字を HashMap に入れます。キーは文字で、値はその文字の出現回数 (int) です。最初の String の反復処理が終了したら、2 番目の String を反復処理し、同じ HashMap で見つかった各文字の値を減らします。
キーがゼロになると、キーと値のペアを HashMap から完全に削除します。2 番目の String の反復処理が終了したら、HashMap が空かどうかを確認するだけです。そうである場合、2 つの文字列は互いの順列/アナグラムであり、そうでない場合、メソッドは 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" を入力すると、null ポインター例外が発生します)。このソリューションで大文字と小文字を区別しないようにして、Null-Pointer Exception が発生する理由を突き止めたいと思います。誰かが私が間違っていることを見ることができますか?
ちょっとしたフォローアップの質問として、2 つの for ループがあるにもかかわらず、そのようなタイプ O(n) のソリューションはありますか?