1

以下のエラーが発生します:

HashMap.CountLetters.main(CountLetters.java:21)のHashMap.CountLetters.tallyPrint(CountLetters.java:12)のスレッド"main"java.lang.NullPointerExceptionの例外

目標は、各文字の出現を。に格納することですHashMap。キーは文字で、値は出現回数です。

package HashMap;

import java.util.HashMap;

public class CountLetters {
    public HashMap tallyPrint(String phrase) {
        int count = 0;
        HashMap<String, Integer> fav = new HashMap<String, Integer>();
        for (int i = 0; i<phrase.length(); i++)
        {
            if (fav.containsKey(phrase.substring(i,i+1)))
                fav.put("" + phrase.substring(i,i+1), fav.get(phrase)+1);
            else
                fav.put("" + phrase.substring(i,i+1),1);
        }
        return fav;
    }

    public static void main(String[] args) {
        CountLetters x = new CountLetters();
        System.out.println(x.tallyPrint("my feet smell and my nose runs"));
    }
}
4

3 に答える 3

2

fav.put("" + phrase.substring(i,i+1), fav.get(phrase)+1)

部分式

fav.get(phrase)

する必要があります

fav.get(phrase.substring(i,i+1))

カウントをインクリメントしようとしていますが、1を追加する前の値を取得する代わりに、無関係のキーの値を取得しているため、NullPointerExceptionに自動アンボックスしようとしnullていintます。

于 2012-12-05T20:51:38.770 に答える
1

ここで使用する必要がありますcharAt()。サブ文字列ではなく、NPEアドレス1をもう1文字読み取ろうとしているときに使用します。

完全なコード

import java.util.HashMap;

public class CountLetters {
    public HashMap tallyPrint(String phrase) {
        int count = 0;
        HashMap<Character, Integer> fav = new HashMap<Character, Integer>();
        for (int i = 0; i<phrase.length(); i++) {
            if (fav.containsKey(phrase.charAt(i))) 
                fav.put(phrase.charAt(i), (fav.get(phrase.charAt(i)))+1);
            else
                fav.put(phrase.charAt(i),1);
        }
        return fav;
    }

    public static void main(String[] args) {
        CountLetters x = new CountLetters();
        System.out.println(x.tallyPrint("my feet smell and my nose runs"));
    }
}

出力

{f = 1、= 6、d = 1、e = 4、a = 1、n = 3、o = 1、l = 2、m = 3、u = 1、t = 1、s = 3、r = 1、y = 2}

于 2012-12-05T20:54:45.973 に答える
0

交換 fav.put("" + phrase.substring(i,i+1), fav.get(phrase)+1);

と:

fav.put("" + phrase.substring(i,i+1), fav.get(phrase.substring(i,i+1))+1);

補足1:同じサブストリングを何度substringも呼び出し続けないように、効率を上げるためにそれを抽出して一時変数に格納する必要があります。substring

補足2:質問に(メインの方法で)全体を投稿していただきありがとうございます。すべての質問者がこのようにした場合、それはそれをより簡単にします。

于 2012-12-05T20:53:20.043 に答える