7

このプログラムは、基本的に文字列配列 tst 内の各文字列の出現回数をカウントするもので、教科書で見つけました。

public class Test {
private static HashMap<String, Integer> mp = new HashMap<String, Integer>();

public static void main(String[] args) {
    String[] tst = new String[] { "ABC", "DEF", "DEF", "DEF","ABC", "DEF", "ABC" };
    checkMap(tst);

}

public static void checkMap(String[] str) {
    for (String st : str) {
        if (!mp.containsKey(st)) {
            mp.put(st, 1);
        }

        else {
            Integer ct = mp.get(st);
            if(ct!=null)
            {
            ct++;
            mp.put(st, ct);
            }
        }
    }

    for (Map.Entry<String, Integer> entry : mp.entrySet()) {
        System.out.println(entry.getKey() + " ocurrs " + entry.getValue()+ " times");
    }
}

}

コードの出力は -

ABC ocurrs 3 times
DEF ocurrs 4 times

私の質問は、ここの if/else ステートメントにあります -

if (!mp.containsKey(st)) {
            mp.put(st, 1);
        }

        else {
            Integer ct = mp.get(st);
            if(ct!=null)
            {
            ct++;
            mp.put(st, ct);
            }
        }

ハッシュマップ内にエントリを入れていない (ハッシュマップが空である) 場合、これはどのような基準で機能しますか? これが非常に基本的な質問である場合は申し訳ありませんが、これを説明するオンラインのどこにも答えが見つかりませんでした. if/else ループに書かれている内容と混同しています。また、この行はここにあります -

Integer ct = mp.get(st);

ハッシュマップが実際には空である場合、キーがマップされている値を取得するにはどうすればよいでしょうか? これを配列に関連付けようとしています-作成されたが初期化されていない配列の要素をクエリすると、nullポインターがスローされます。誰か、これがハッシュマップでどのように機能するか説明してください。もう一度、このような基本的な質問をして申し訳ありません。

4

5 に答える 5

5

さて、この行では、マップにキーが含まれているかどうかを確認します

if (!mp.containsKey(st)) {

式の前にa があるので!、これは「マップにキーが含まれていない場合」を意味します。その後、「then」ブロックが続き、キーを値とともにマップに挿入します1(キーが存在しないため)。

それ以外の場合は、キーが存在する場合 (elseブロック)、そのキーの値を取得し、インクリメント ( ct++) して、同じキーのマップに再度追加します。

if(ct!=null)このコードではnull チェック ( ) は必要ありません。


この質問に関する一般的な意見:

ハッシュマップが実際には空である場合、キーがマップされている値を取得するにはどうすればよいでしょうか?

マップに存在しないキーから何かを取得しようとするとHashMap、マップは を返しますnull。これは、空のマップから取得しようとするすべてのキーに当てはまります。


これが何を意味するのか説明してもらえますか -Integer ct = mp.get(st);

map.get(key)そのキーに格納されている値を返します。マップ自体はキーと値のペアのコレクションです。つまり、キーごとにマップ内に 1 つの値があります。したがって、そのキーに格納されている値を取得するには、map.get(key). map.put("ABC", 10)マップを保存すると、 が返さ10map.get("ABC")ます。

于 2013-06-22T10:15:12.413 に答える
1
  1. これは、hashMap に特定のキーが含まれているかどうかを containsKey 関数がチェックするためです。
  2. HashMap が空で、存在しないキーを取得しようとすると、null 値が返されます。
于 2013-06-22T10:15:58.543 に答える
0

null チェックは必要ありません。キーがマップに含まれていてその値が null でないか、キーがマップに含まれていません。

値が null にならないことを確信できる理由は、マップ (およびそのすべてのコンテンツ) が定義され、メソッドで使用されており、null がそこに到達する機会がないためです。

get()含まれていないキーが渡された場合、メソッドは null を返しますが、このコードでは決して起こりません。

とにかく、コードは洗練されていません。これらの行はすべて、1 つの単純な行として表すことができます。

mp.put(mp.containsKey(st) ? mp.get(st) + 1 : 1);
于 2013-06-22T10:15:24.237 に答える
0

テスト:

if (!mp.containsKey(st))

そのキーによってマップにエントリがないかどうかをテストします。

elseしたがって、ブランチにエントリが存在し、null 以外の値を持つことは論理的です...これにより、ct == nullテストが冗長になります。

値が存在する場合、コードget()は既存の値に 1 を追加し (実際には新しい値を作成しますが、それはInteger別の話です) put()、新しい値を返します。

そのコードでは、オートボクシングと非オートボクシングが混在していることに注意してください。mp.put(st, 1)オートボクシングを行います。舞台裏では本当にそうmp.put(st, new Integer(1))です。

同様に:

Integer ct = mp.get(st);
ct++;

本当に:

Integer ct = mp.get(st);
Integer tmp = new Integer(ct.intValue() + 1);
ct = tmp;
于 2013-06-22T10:15:24.790 に答える
0

stfor (String st : str)ループでここに到達します。とは関係ありませんHashMap

if (!mp.containsKey(st)) {

にキーが含まれているHashMapかどうかをテストします。アイテムがない場合、明らかにキーを含めることはできません。次に、使用するブロックで を使用します。これは、含まれていることがチェックされているため(実際には含まれていません)、常に成功します。notstelsemp.get(st)mpst

null チェックif (ct == null)がここにあるのは、何らかの理由nullで問題のキーのマップが含まれている場合です。ただし、コードが整数をマップに配置し、キーの存在をテストするだけの場合、これは可能ではないため、null チェックを削除する必要があります。

于 2013-06-22T10:16:03.207 に答える