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は配列より少し難しいと見えますが、開発現場に多く利用されていますので、ぜひ習得しておいてください。

    広告