1

この記事の目次



1.  Mapインタフェースのまとめ


Mapとは2つの情報をキー(重複を許さない)と値のペアとして格納するデータ構造です。格納した値はキーを指定して読み書きできます。

Listインタフェース同様、Mapインタフェースも、キーと値のペアの集まりという抽象概念を提供するのみで、それを内部的にどう実装するかは指定しません。どう実装するかはMapインタフェースを実装するクラスに委ねられます。

Mapインタフェースを実装する具象クラスは次の3つあります。

  • HashMap:ハッシュテーブルに基づく実装で、順序を保証しません
  • LinkedHashMap:予想可能な繰り返し順序をもち、ハッシュ表と連結リストによる実装です
  • TreeMap:Red-Black Treeに基づく実装です。要素ははデフォルトで昇順に並べられます
  • Mapインタフェースが提供する操作は単純です。基本的はget, put, removeだけですが、実用上はもう少しメソッドを知る必要があります。以下はMapインターフェースの代表的なメソッドを一覧します。

    メソッド 意味 戻り値
    put(キー,値) マップにキーと値のペアを格納する 値
    get(キー) キーに対応する値を取得する(なければnull) 値
    size() 格納されているペア数を数える int
    isEmpty() 要素数がゼロであるか判定する boolean
    containsKey(キー) 指定データがキーに含まれているかを判定する boolean
    containsValue(値) 指定データが値に含まれているか判定する boolean
    clear() 要素を全て削除する void
    remove(キー) 指定した内容の要素を削除する boolean
    keySet 格納されているキーの一覧をする Set(キー)

    2.  HashMapの宣言と初期化


    HashMap<キーの型名, 値の型名> 変数名 = new HashMap<>();
    例
    HashMap< String,String > hashMap1 = new HashMap<>();
    HashMap< Integer,String > hashMap2 = new HashMap<>();
    HashMap< Integer,Float > hashMap3 = new HashMap<>();
    HashMap< String,Date > hashMap4 = new HashMap<>();

    注意 : java.util.HashMapをimportする必要があります。

    3.  要素の格納・追加・取得・取消


     ●  要素を格納・追加する

    HashMap変数名.put(キー名, 値);
    HashMap変数名.putAll(HashMap変数2);
  • put()メソッドは第一引数にキーを指定し、第二引数にキーに対応する値を指定します。
  • HashMapにすでにキーに対するマッピングがある場合は、古い値は指定された値に置き換えられ、キーに対応する値を戻り値として返しますが、キーのマッピングが無かった場合はキーと値のペアを新しく追加し、nullを戻り値として返します。putAll()メソッドは引数のHashMap変数2の全てのデータを元HashMap変数に追加するメソッドです。
  • 例
    package helloworld;
    
    import java.util.HashMap;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            
            //hashMapをコンソールに出力する
            System.out.println("元のhashMap:" + hashMap);
            
            //重複したキーで値を入れ替える
            hashMap.put("Apple", "アップル2");
            
            //hashMapをコンソールに出力する
            System.out.println("hashMapのAppleキーに対応する値を入れ替えた:" + hashMap);
            
            //String型のキーとString型の値のペアからなるhashMap2を宣言する
            HashMap< String, String > hashMap2 = new HashMap<>();
            
            //putAll()メソッドでhashMap2にhashMapの全ての要素を追加する
            hashMap2.putAll(hashMap);
            
            //putAll()で要素を追加したhashMap2の要素を出力する
            System.out.println("putAll()で要素を追加したhashMap2:" + hashMap2);
        
        }
        
    }
    

    実行結果:
    元のhashMap:{Apple=アップル, Orange=オレンジ, Banana=バナナ}
    hashMapのAppleキーに対応する値を入れ替えた:{Apple=アップル2, Orange=オレンジ, Banana=バナナ}
    putAll()で要素を追加したhashMap2:{Apple=アップル2, Orange=オレンジ, Banana=バナナ}

     ●  要素を取り出す

    HashMap変数名.get(キー);
  • get()メソッドは指定したキーに対応する値を取得するメソッドです。
  • 指定したキーは見つからなかったら、nullと返します
  • 配列はget()の引数が番目ですが、Mapはキーであることを注意しましょう。
  • 例
    package helloworld;
    
    import java.util.HashMap;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            
            //hashMap内の「Apple」キーに応じる値をコンソールに出力する
            System.out.println("「Apple」の値:" + hashMap.get("Apple"));
        
        }
        
    }

    実行結果:
    「Apple」の値:アップル

     ●  要素を削除する

    * 指定キーの要素を削除する

    HashMap変数名.remove(キー);
    HashMap変数名.remove(キー,値);
  • remove(キー):remove()メソッドに引数は1つしかない時、指定されたキーのマッピングがあればHashMapから削除します。
  • HashMap変数名.remove(キー,値):引数が2つある時、指定された値に指定されたキーが現在マッピングされている場合にのみ、そのキーのエントリを削除します。
  • * clear()で全ての要素を削除する

    HashMap変数名.clear();
  • すべてのマッピングをHashMapから削除します。
  • 例
    package helloworld;
    
    import java.util.HashMap;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            hashMap.put("Tomato", "トマト");
            
            //hashMap内の「Apple」キーに応じる値をコンソールに出力する
            System.out.println("元のhashMap: " + hashMap);
            
            //hashMapの「Apple」キーの要素を削除する
            hashMap.remove("Apple");
            System.out.println("remove(\"Apple\")を実行したhashMap: " + hashMap);
            
            //hashMap内の「Banana」キーと"バナナ"値の要素を削除する
            hashMap.remove("Banana","バナナ");
            System.out.println("remove(\"Banana\",\"バナナ\")を実行したhashMap: " + hashMap);
            
            //hashMap内の「Orange」キーと"バナナ"値の要素を削除したいが、マッピングされないため削除しません。
            hashMap.remove("Orange","バナナ");
            System.out.println("remove(\"Orange\",\"バナナ\")を実行したhashMap: " + hashMap);
            
            //clear()メソッドで全ての要素を削除する
            hashMap.clear();
            System.out.println("clear()を実行したhashMap: " + hashMap);
        
        }
        
    }
    

    実行結果:
    元のhashMap: {Apple=アップル, Tomato=トマト, Orange=オレンジ, Banana=バナナ}
    remove("Apple")を実行したhashMap: {Tomato=トマト, Orange=オレンジ, Banana=バナナ}
    remove("Banana","バナナ")を実行したhashMap: {Tomato=トマト, Orange=オレンジ}
    remove("Orange","バナナ")を実行したhashMap: {Tomato=トマト, Orange=オレンジ}
    clear()を実行したhashMap: {}

    4.  要素を順に取り出す方法


     ●  拡張for文を用いたHashMap要素の取り出し

    * HashMapのキーをkeySet()メソッドで取得する

    for(HashMapのキーの型  key:  HashMap変数名.keySet()){
        //key でget()メソッドを使って要素を扱う
    }
  • keySet()メソッドはMapのキーをSet型で返しますので、拡張for文を使って繰り返して取得することができます。
  • 例
    package helloworld;
    
    import java.util.HashMap;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            hashMap.put("Tomato", "トマト");
            
            //拡張for文でhashMapの全てのキーを取り出す
            for(String key : hashMap.keySet()){
                System.out.println(" " + key);
            }
        
        }
        
    }

    実行結果:
     Apple
     Tomato
     Orange
     Banana

    * HashMapの値をvalues()メソッドで取得する

    for(HashMapの値の型  value:  HashMap変数名.values()){
        //valueを使って要素を扱う
    }
  • values()メソッドもHashMapの値をSet型で返しますので、拡張for文を使って繰り返して取得することができます。
  • 例
    package helloworld;
    
    import java.util.HashMap;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            hashMap.put("Tomato", "トマト");
            
            //拡張for文でhashMapの全ての値を取り出す
            for(String value : hashMap.values()){
                System.out.println(" " + value);
            }
        
        }
        
    }
    

    実行結果:
     アップル
     トマト
     オレンジ
     バナナ

    * キーと値のペアを全て取得する

    for(Map.Entry<キー型, 値型> entry : HashMap変数名.entrySet()){
        //キーを返すentry.getKey()と値を返すentry.getValue()を用いて操作する
    }
  • Mapのキーと値のペアはMap.Entryインタフェースで表され、MapのEntryをentrySet()メソッドで取得します。
  • MapのEntryからgetKey()メソッドでキーを、getValue()メソッドで値を取得することができます。
  • java.util.Mapをimportする必要があります。
  • 例
    package helloworld;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            hashMap.put("Tomato", "トマト");
            
            //拡張for文でhashMapの全てのキーと値を取り出す
            for(Map.Entry< String, String > entry: hashMap.entrySet()){
                System.out.println(entry.getKey() + " : " + entry.getValue());
            }
        
        }
        
    }

    実行結果:
    Apple : アップル
    Tomato : トマト
    Orange : オレンジ
    Banana : バナナ

     ●  イテレータを用いたHashMap要素の取り出し

    for (Iterator> iterator = HashMap変数名.entrySet().iterator(); iterator.hasNext();) {
        Map.Entry< キー型, 値型 > entry = iterator.next();
        //キーを返すentry.getKey()と値を返すentry.getValue()を用いて操作する
    }
  • IteratorにMapのすべてのキーと値のペアをHashMap変数名.entrySet().iterator()で設定して、iterator.hasNext()で次の要素がなくなるまでループ処理をしています。
  • 次にiterator.next()で一組のキーと値のペア取得し、 getKey()メソッドでキーを、getValue()メソッドで値を取得して表示しています。
  • java.util.Mapとjava.util.Iteratorをimportする必要があります。
  • 例
    package helloworld;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            hashMap.put("Tomato", "トマト");
            
            //IteratorでhashMapの全てのキーと値を取り出す
            for(Iterator< Map.Entry< String, String > > iterator = hashMap.entrySet().iterator(); iterator.hasNext();){
                Map.Entry< String, String > entry = iterator.next();
                System.out.println(entry.getKey() + " : " + entry.getValue());
            }
        
        }
        
    }

    実行結果:
    Apple : アップル
    Tomato : トマト
    Orange : オレンジ
    Banana : バナナ

    5.  主に使われているメソッド


     ●  size()で要素数を取得する

    HashMap変数名.size()
  • size()メソッドはHashMap内のキー値マッピングの数を返します。
  • HashMapを初期化直後にsizeメソッドを使った場合は0を返してくれます。
  •  ●  containsKey()とcontainsValue()で指定データがキーか値に含まれているかを判定する

    HashMap変数名.containsKey(キー);
    HashMap変数名.containsValue(値);
  • containsKey(キー)メソッドは指定のキーの要素がこのHashMapに含まれている場合にtrueを返します。
  • containsValue(値)はこのHashMapが1つまたは複数のキーを指定された値にマッピングしている場合にtrueを返します。
  • 例
    package helloworld;
    
    import java.util.HashMap;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            hashMap.put("Tomato", "トマト");
            
            //hashMapの全ての要素をコンソールに出力する
            System.out.println("全要素:" + hashMap);
            
            //containsKey()で指定データがキーに含まれているかを判定する
            if(hashMap.containsKey("Apple")){
                System.out.println("「Apple」のキーの要素が見つかりました");
            }
            //containsValue()で指定データが値に含まれているかを判定する
            if(hashMap.containsValue("バナナ")){
                System.out.println("「バナナ」の値の要素が見つかりました");
            }
        
        }
        
    }
    

    実行結果:
    全要素:{Apple=アップル, Tomato=トマト, Orange=オレンジ, Banana=バナナ}
    「Apple」のキーの要素が見つかりました
    「バナナ」の値の要素が見つかりました

     ●  replace()で要素を置き換える置き返す

    replace(キー,値);
    replace(キー,値1,値2);
  • replace(キー,値)は指定されたキーがなんらかの値に現在マッピングされている場合にのみ、そのキーのペアを置換します。
  • replace(キー,値1,値2)は指定されたキーが指定された値1に現在マッピングされている場合にのみ、そのキーに応じる値を値2に置換します。
  • 例
    package helloworld;
    
    import java.util.HashMap;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            
            //hashMapの全ての要素をコンソールに出力する
            System.out.println("元のhashMapの全要素:" + hashMap);
            
            //"Apple"キーのペアを["Apple", "アップル2"]に置き返す
            hashMap.replace("Apple", "アップル2");
            System.out.println("新しいhashMapの全要素:" + hashMap);
            
            //["Banana", "バナナ"]のペアから["Banana","バナナ2"]に置き返す
            hashMap.replace("Banana", "バナナ","バナナ2");
            System.out.println("新しいhashMapの全要素:" + hashMap);
        
        }
        
    }

    実行結果:
    元のhashMapの全要素:{Apple=アップル, Orange=オレンジ, Banana=バナナ}
    新しいhashMapの全要素:{Apple=アップル2, Orange=オレンジ, Banana=バナナ}
    新しいhashMapの全要素:{Apple=アップル2, Orange=オレンジ, Banana=バナナ2}

    6.  HashMapの値をListに変換する


    List<値の型> List変数名 = new ArrayList<値の型>(Map型の変数名.values());
  • まず、valuesメソッドはMapに格納された全ての値を返します。それから、その値の集まりをArrayListに変換します
  • 例
    package helloworld;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
    
            //String型のキーとString型の値のペアからなるhashMapを宣言する
            HashMap< String, String > hashMap = new HashMap<>();
            
            //hashMapに要素を追加する
            hashMap.put("Apple", "アップル");
            hashMap.put("Banana", "バナナ");
            hashMap.put("Orange", "オレンジ");
            
            //hashMapの全ての要素をコンソールに出力する
            System.out.println("元のhashMapの全要素:" + hashMap);
            
            // Listを宣言し、valuesメソッドを使用してMapの値を取得して、Listに格納する
            List< String > list = new ArrayList<>(hashMap.values());
            System.out.println("listの全要素:" + list);
        
        }
        
    }

    実行結果:
    元のhashMapの全要素:{Apple=アップル, Orange=オレンジ, Banana=バナナ}
    listの全要素:[アップル, オレンジ, バナナ]

    7.  まとめ


    今回はMapの代表としてHashMapについてまとめていきました。HashMapは配列より少し難しいと見えますが、開発現場に多く利用されていますので、ぜひ習得しておいてください。

    広告