今回はJavaのHashMapの使い方について解説していきます。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
私はプログラミング学習はオンライン動画学習サービスのUdemyで行うのが圧倒的におすすめです。
Udemyでは
-
- 動画で好きな時間・隙間時間に学べる
- 一流のエンジニアから教えてもらえる
- 好きな技術を体系的に学べる
- 実際に手を動かしながら学ぶことができる
- セール時であれば1500円〜2000円ほどで購入できる(大半の技術書より安い)
- 講座自体がアップデートされていくので情報が古くなりにくい
UdemyにはJavaの基礎講座
もあるのでJavaをこれから勉強してプログラミングを勉強したい!という方にオススメです!
コメント