HashMapによる単語のカウント

単語のカウントとHashMap

HashMap<K, V> のメソッド

boolean containsKey(Object key)
マップが指定のキーのマッピングを保持する場合に true を返す。
V get(Object key)
この識別情報ハッシュマップで指定されたキーにマップされている値を返す。
Set<K> keySet()
マップに格納されているキーのセットビューを返す。
V put(K key, V value)
指定の値と指定されたキーをこのマップに関連付ける。
V remove(Object key)
キーに対するマッピングがあれば、そのキーをマップから削除する。
int size()
マップ内のキー値マッピングの数を返す。

コード例

key が String, value が Integer の例。 Integer は定数で値を変更できないため、値を増やすときには int にする。 この変換は JDK 1.5 以降では自動で行われる。

termMap figure

JDK 1.5 以降の場合

標準入力(通常キーボード)から入力された単語列(空白区切り)を対象として、 各単語の出現回数を数える。

import java.util.HashMap;
import java.util.Scanner;
import java.util.Iterator;

class WordCounter {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        HashMap<String, Integer> termMap = new HashMap<String, Integer>();

        while(scanner.hasNext()) {
            String term = scanner.next();
            // 単語の出現回数を1増やす
            int count = 1;
            if(termMap.containsKey(term)){
                count += termMap.get(term);
            }
            termMap.put(term, count);
        }

        // 単語数の表示 (ソートはせず)
        Iterator<String> iterator = termMap.keySet().iterator();
	while(iterator.hasNext()) {
	    String key = iterator.next();
	    Integer value = termMap.get(key);
	    System.out.println(key + ": " + value);
	}
    }
}

JDK 1.4 以前の場合

JDK 1.5 以降でも動作するが、その場合には前掲のコードを推奨する。

import java.util.HashMap;

	HashMap termMap = new HashMap();
        String term;

	...
	(termにカウントしたい文字列を入れる)
	...

	// 単語の出現回数を1増やす
	int count = 1;
	if(termMap.containsKey(term)){
	    count += ((Integer)termMap.get(term)).intValue();
	}
	termMap.put(term, new Integer(count));

	...

	// 単語数の表示
	Iterator iterator = termMap.keySet().iterator();
	while(iterator.hasNext()) {
	    String key = (String)iterator.next();
	    Integer value = (Integer)termMap.get(key);
	    System.out.println(key + ": " + value);
	}