【Java】HashMapの使い方

今回はJavaのHashMapの使い方について解説していきます。HashMapはキーと値を関連付けて要素を保持できます。

Mapインターフェースの公式ドキュメント

HashMapの公式ドキュメント

HashMapのオブジェクトを生成

まずはHashMapを使うためにオブジェクトの生成を行います。java.utilからMapと HashMapをimportします。その後インスタンス化を行います。今回はキーをInteger型、値をString形で保持するHashMapを作成しました。isEmptyメソッドを使うことでデータが存在するか確かめることができます。何らかのデータが入っている場合はfalseがからの状態だとtrueが返ってきます。初期状態では当然何も入っていないのでtrueが返ってきます。

import java.util.HashMap;
import java.util.Map;

public class HashMapTest {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();

        System.out.println(map.isEmpty());
    }
}

要素の追加

Mapに要素を追加するためにはputメソッドを使います。第一引数にキーの値を渡し第二引数にそのキーに対応する値を渡します。

Map<Integer, String> countryMap = new HashMap<>();

countryMap.put(1, "Japan");
countryMap.put(2, "America");
countryMap.put(3, "China");

キーを指定して要素を取り出す

先ほどcountryMapに追加した要素たちをキーを指定して取り出してみます。取り出すためにはgetメソッドを使い、第一引数に取り出したいキーを渡します。

Map<Integer, String> countryMap = new HashMap<>();

countryMap.put(1, "Japan");
countryMap.put(2, "America");
countryMap.put(3, "China");

System.out.println(countryMap.get(1));
System.out.println(countryMap.get(2));
System.out.println(countryMap.get(3));

実行結果は次のようになります。キーを指定することで値を取り出すことができました。

Japan
America
China

 



全てのキー・値を取得

全てのキーを取得するためにはkeySetメソッドを使います。キーは重複が許されないためSetとしてまとめて返ってきます。これをfor文などでループ処理することでキーを一覧表示できます。

Map<Integer, String> countryMap = new HashMap<>();

countryMap.put(1, "Japan");
countryMap.put(2, "America");
countryMap.put(3, "China");

for(Integer key: countryMap.keySet()) {
    System.out.println(key);
}

実行結果は次の通りです。

1
2
3

またvaluesメソッドを使うことで値を全部取り出すことができます。こちらは重複が許されるのでCollectionビューが返ってきます。

Map<Integer, String> countryMap = new HashMap<>();

countryMap.put(1, "Japan");
countryMap.put(2, "America");
countryMap.put(3, "China");

for(String value: countryMap.values()) {
    System.out.println(value);
}

実行結果

Japan
America
China

putAll

一つのMapに別のMapを合体させたい時に使えるのがputAllです引数に吸収される側のMapを渡して一つの要素数の多いMapを作ることができます。

// 一つ目のMapを作成
Map<Integer, String> countryMap = new HashMap<>();
countryMap.put(1, "Japan");
countryMap.put(2, "America");
countryMap.put(3, "China");

// 二つ目のMapを作成
Map<Integer, String> countryMapVer2 = new HashMap<>();
countryMapVer2.put(4, "France");
countryMapVer2.put(5, "Germany");
countryMapVer2.put(6, "Singapore");

// countryMapにcountryMapVer2の要素を全て追加する
countryMap.putAll(countryMapVer2);

// countryMapの値を表示してみる
for(String country: countryMap.values()){
    System.out.println(country);
}

 



検索

Mapの中にキー・値が存在するか確かめるメソッドも用意されています。キーの検索を行うのがcontainsKeyメソッドで値の検索を行うのがcontainsValuesメソッドです。

まずはcontainsKeyメソッドを使ってみます。引数にMapの中に含まれているか知りたいキーを渡します。存在していればtrueが存在していなければfalseが返ってきます。

Map<Integer, String> countryMap = new HashMap<>();

countryMap.put(1, "Japan");
countryMap.put(2, "America");
countryMap.put(3, "China");
countryMap.put(4, "France");
countryMap.put(5, "Germany");
countryMap.put(6, "Singapore");

System.out.println(countryMap.containsKey(4));
System.out.println(countryMap.containsKey(8));

実行結果は次のようになります。

true
false

次にcontainsValueメソッドです。先ほどのcontainsKeyとほとんど同じ要領です。

Map<Integer, String> countryMap = new HashMap<>();

countryMap.put(1, "Japan");
countryMap.put(2, "America");
countryMap.put(3, "China");
countryMap.put(4, "France");
countryMap.put(5, "Germany");
countryMap.put(6, "Singapore");

System.out.println(countryMap.containsValue("Japan"));
System.out.println(countryMap.containsValue("Canada"));

実行結果

true
false

削除

最後にremoveメソッドを使ってみます。removeメソッドは一つだけ引数を渡した場合はそれに合致したキーの要素を削除します。二つ引数を渡すと一つ目のキーに対して二つ目の値が結び付けられているときだけ削除されます。

まずは引数一つのパターンを試してみます。まずはremoveに1を渡してみます。countryMapにはキーが1の要素は存在するので削除されます。確認のためにremoveの前後でcontainsKeyメソッドを呼び出して1というキーがcountryMapに含まれているか出力します。

2回目は存在しないキーである8を渡してみます。こちらは確認のためにMapの要素数を返してくれるsizeメソッドを使っています。

Map<Integer, String> countryMap = new HashMap<>();
countryMap.put(1, "Japan");
countryMap.put(2, "America");
countryMap.put(3, "China");
countryMap.put(4, "France");
countryMap.put(5, "Germany");
countryMap.put(6, "Singapore");

System.out.println(countryMap.containsKey(1));
countryMap.remove(1);
System.out.println(countryMap.containsKey(1));
        
System.out.println(countryMap.size());
countryMap.remove(8);
System.out.println(countryMap.size());

実行結果は以下のようになります。1回目の前後でtrueがfalseに変わっていて、2回目の前後ではサイズが変わらないことが確認できました。

true
false
5
5

 



次に引数2つのバージョンも試してみます。二つ渡した場合は一つ目をキーとして二つ目の値が存在する場合は削除されます。1回目は第一引数に1、第二引数に「Japan」を渡します。このキーと値の組み合わせは存在するので削除が行われます。

2回目は第一引数に3、第二引数に「France」を渡します。それぞれキーが3の要素と値が「France」の要素は存在していますが、それらは結びついてはいないので削除が行われません。

Map<Integer, String> countryMap = new HashMap<>();
countryMap.put(1, "Japan");
countryMap.put(2, "America");
countryMap.put(3, "China");
countryMap.put(4, "France");
countryMap.put(5, "Germany");
countryMap.put(6, "Singapore");

System.out.println(countryMap.containsKey(1));
countryMap.remove(1, "Japan");
System.out.println(countryMap.containsKey(1));
        
System.out.println(countryMap.containsKey(3));
countryMap.remove(3, "France");
System.out.println(countryMap.containsKey(3));

実行結果

true
false
true
true

コメント

タイトルとURLをコピーしました