【Java入門】マップ(Map)で初期化、ループしてみよう!【キーや値の取り出しも解説】

プログラミング入門Java入門
スポンサーリンク

こんにちは!しーま(@s59shima)です。

いつもブログをご覧いただきありがとうございます。

今回は、こんな悩みや疑問を持った人に向けて記事を書きました。

読者
読者

Key(キー)とValue(値)を対に保持できるのは分かったけど、実際にどうやって使用するの!?

存在は知っているけど、「マップ(Map)の使い方」や「Keyに対するValueの取り出し方法」について知りたい方におすすめの記事です。

マップ(Map)はJava系アプリ・システム開発では使用頻度がめちゃめちゃあると思います。

基本的な使用方法などを学んでいきましょう!!

マップ(Map)とは

複数の値をまとめて保持できるオブジェクトの総称を「コレクション」と言います。

そしてJavaには標準APIとしてコレクション関連が多数提供されています。

その中の1つとして【Map】が存在します。

Mapは、キーと値を保持する仕組みです。

Map系の代表的なクラスとして「HashMap」「TreeMap」がありますね。

どのようなクラス図になっているか確認してみましょう。

マップのクラス図

実は、HashMap TreeMapクラスは上位のクラスを継承したり、インターフェースを実装して成り立っているんです。※ 図を分かり易くするため、省略している部分もあります。

Mapの初期化

new演算子を用いて初期化・オブジェクトを生成することが出来ます。

たとえば、String型のマップを初期化・生成する場合はこんな感じになります。

import java.util.HashMap;
HashMap<String, String> map = new HashMap<String, String>();

TreeMapを初期化・生成する場合は上記の【HashMap】の部分を置き換えればよいです。

初期化のポイントは以下の2つです。

  1. 格納できる要素数を変更できるため、初期化時に要素数を定義しない
  2. ジェネリクス(Generics)を用いて【型の指定】を行う

1. 要素数を指定しなくてもよい

マップはリストと同様、初期化の段階で要素数の宣言をしません。

そのため、後から要素の追加・削除が可能です。

配列の場合は、下記のように初期化の段階で宣言する必要がありましたよね。要素数を宣言したら変更することはできません。

String[] array = new String[5]; // 配列の場合
ArrayList<String> list = new ArrayList<String>(); // リスト(List系)の場合
HashMap<String, String> map = new HashMap<String, String>(); // マップ(Map系)の場合

配列とは初期化の方法が違うことも意識しましょうね。

2. ジェネリクスを用いて型を強調

マップの初期化を行う際、以下のように書くこともできます。

HashMap map = new HashMap();

実は、初期化は2種類の方法があります。違いはデータ型を宣言している・していないです。

HashMap map = new HashMap(); // データ型の宣言なし
HashMap<String, String> map = new HashMap<String, String>(); // データ型の宣言あり

データ型を宣言している <String> などの書き方はジェネリクス(Generics)と言います。

データ型を宣言してマップを初期化(ジェネリクス有)した場合と、データ型を宣言せずマップを初期化(ジェネリクス無)した場合を比較し、ジェネリクス有が推奨される理由を解説します。

ジェネリクス【有】サンプルコード

import java.util.HashMap;

public class Main {
  public static void main(String[] args) {

    HashMap<String, String> map = new HashMap<String, String>();
    map.put("spring", "春");
    String out = map.get("spring");
    System.out.println( out );

  }
}

実行結果は下記の通り。

ジェネリクス【無】サンプルコード

import java.util.HashMap;

public class Main {
  public static void main(String[] args) {

    HashMap map = new HashMap();
    map.put("spring", "春");
    String out = map.get("spring");
    System.out.println( out );

  }
}

実行結果は下記の通り。

構文エラー(8行目)

ジェネリクス無の場合は、8行目で構文エラーとなってしまいました。

理由はマップを初期化する際にデータ型を宣言していないため、8行目でString型にキャストしてあげる必要があります。

つまり、8行目を「String out = (String)map.get(“spring”)」と明示的に書く必要があります。

ジェネリクス【無】の場合、プログラムミスにも繋がりやすく、都度キャストする手間がかかります。

以上の理由から、リストを初期化する場合 ジェネリクス【有】で宣言することをオススメします。

Mapをループする4つの方法

ループする方法は以下の4つ。

  • キーの一覧を取得(keySet)
  • 値の一覧を取得(keySet)
  • キーと値の両方を取得(entrySet)
  • キーと値の両方を取得(forEach)

キーの一覧を取得(keySet

keySetメソッドでキーを取得することができます。

import java.util.HashMap;

public class Main {
  public static void main(String[] args) {

    HashMap<String, String> map = new HashMap<String, String>();
    map.put("spring", "春");
    map.put("summer", "夏");
    map.put("fall",   "秋");
    map.put("winter", "冬");
    for ( String season : map.keySet() ) {
      System.out.println( season );
    }

  }
}

実行結果は下記の通り。

spring fall winter summer

値の一覧を取得(values

valuesメソッドで値を取得することができます。

import java.util.HashMap;

public class Main {
  public static void main(String[] args) {

    HashMap<String, String> map = new HashMap<String, String>();
    map.put("spring", "春");
    map.put("summer", "夏");
    map.put("fall",   "秋");
    map.put("winter", "冬");
    for ( String season : map.values() ) {
      System.out.println( season );
    }

  }
}

実行結果は下記の通り。

春 秋 冬 夏

キーと値の両方を取得(entrySet)

entrySetメソッドでキーと値の両方を取得することができます。

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

public class Main {
  public static void main ( String[] args ) {
    
    HashMap < String, String > map = new HashMap < String, String > ();
    map.put("spring", "春");
    map.put("summer", "夏");
    map.put("fall",   "秋");
    map.put("winter", "冬");
    for ( Map.Entry<String, String> entry : map.entrySet() ) {
      System.out.println( entry.getKey() + ":" + entry.getValue() );
    }

  }
}

実行結果は下記の通り。

spring:春
fall:秋
winter:冬
summer:夏

キーと値の両方を取得(forEach)

forEachメソッドでキーと値の両方を取得することができます。

import java.util.HashMap;

public class Test {
  public static void main ( String[] args ) {
    
    HashMap < String, String > map = new HashMap < String, String > ();
    map.put("spring", "春");
    map.put("summer", "夏");
    map.put("fall",   "秋");
    map.put("winter", "冬");
    map.forEach( (key, value) -> {
      System.out.println ( key + ":" + value );
    } );

  }
}

実行結果は下記の通り。

spring:春
fall:秋
winter:冬
summer:夏

本記事のまとめ

今回は、Mapの初期化する方法やMapをループしてキーや値を取り出す方法について解説しました。

最後まで読んでいただきありがとうございます(*^-^*)

本記事の内容をまとめると以下の通りです。

本記事のまとめ
  • Mapの初期化時は、要素数を指定しない
  • Mapの初期化時は、ジェネリクス(Generics)を用いる
  • MapからKeyを取り出すには、keySetメソッドを使用する。
  • MapからValueを取り出すには、valuesメソッドを使用する。

おすすめ記事

Javaプログラミングをもう一度本格的に勉強したいっ!」という方へ

逆に、「Javaプログラミング以外を本格的に勉強したいっ!」という方へ

関連記事

List/Set/Mapの活用方法について、下記の記事がありますので合わせてどうぞ

Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
タイトルとURLをコピーしました