【Java】Mapを使ってループさせる5つの方法
目次
一般に、JavaでMapをループさせる方法は5つあります。
今回は、それらすべてについて説明し、それらの長所と短所についても説明します。
まず、Mapはコレクションではないため、イテレータを使用してMapを直接、反復処理することはできません。
また、先に進む前に、Map.Entry
JavaのすべてのマップはMapインターフェースを実装しているため、手法は
すべてのマップ実装(HashMap、TreeMap、LinkedHashMap、Hashtableなど)で機能します。
ループさせる方法
For-Eachを使用(Map.entrySet())
Map.entrySet()メソッドは、このマップに含まれるマッピングの
collection-view(Set
したがって、Map.Entry
キーと値のペアを反復処理できます。
このメソッドは最も一般的であり、ループでマップキーと値の両方が
必要な場合に使用する必要があります。
keySet()メソッドとvalues()メソッドを使用
Map.keySet()メソッドは、このマップに含まれるキーのSetビューを返し、
Map.values()メソッドは、このマップに含まれる値のコレクションビューを返します。
したがって、マップのキーまたは値のみが必要な場合は、for-eachループを使用して
キーまたは値を反復できます。
Map.Entryでイテレーターを使用
このメソッドは、For-Eachと多少似ています。
For-Eachでは、Map.Entry
ここではイテレータを使用しています。
Map.Entry
つまり、反復中にiterator.remove()メソッドを呼び出すことにより、mapからエントリを削除できます。
forEach(action)メソッドの使用
Map.forEach(action)メソッドを使用し、ラムダ式を使用してマップを反復できます。
この方法はクリーンで高速です。
キーの反復と値の検索
ここでは、最初にキーをループし(Map.keySet()メソッドを使用)、
次に各キーの値を検索します(Map.get(key)メソッドを使用)。
このメソッドは、キーによる値の取得には時間がかかる可能性があるため、かなり遅く、非効率的です。
5つの方法すべてを使って実装
先ほど紹介した5つの方法をそれぞれ、サンプルコードを使って
実装してみます。Map内は同じものを使用し、それぞれの方法で取り出しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class sample { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("1", "1月"); map.put("2", "2月"); map.put("3", "3月"); map.put("4", "4月"); map.put("5", "5月"); map.put("6", "6月"); //For-Eachを使用(Map.entrySet() System.out.println("Sample1"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("キー : " + entry.getKey() + "値 : " + entry.getValue()); } // forEach(action)メソッド System.out.println("Sample2"); map.forEach((k, v) -> System.out.println("キー : " + k + "値 : " + v)); // Map.Entry<K、V> System.out.println("Sample3"); Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); System.out.println("キー : " + entry.getKey() + "値 :" + entry.getValue()); } // Keyset()メソッドのみ System.out.println("Sample4"); for (Object key : map.keySet()) { System.out.println("キー : " + key.toString() + "値 : " + map.get(key)); } // Keyset()メソッド + alues()メソッド System.out.println("Sample5"); for (Object key : map.keySet()) { System.out.println("キー : " + map.get(key)) } for (Object values : map.values()) { System.out.println("値 : " + map.get(values)); } // キーの反復と値の検索 System.out.println("Sample6"); for (Object key : map.keySet()) { String values = map.get(key); System.out.println("キー : " + key + "値 : " + values); } } } |
出力結果
Sample1
キー : 1 値 : 1月
キー : 2 値 : 2月
キー : 3 値 : 3月
キー : 4 値 : 4月
キー : 5 値 : 5月
キー : 6 値 : 6月
Sample2
キー : 1 値 : 1月
キー : 2 値 : 2月
キー : 3 値 : 3月
キー : 4 値 : 4月
キー : 5 値 : 5月
キー : 6 値 : 6月
Sample3
キー : 1 値 : 1月
キー : 2 値 : 2月
キー : 3 値 : 3月
キー : 4 値 : 4月
キー : 5 値 : 5月
キー : 6 値 : 6月
Sample4
キー : 1 値 : 1月
キー : 2 値 : 2月
キー : 3 値 : 3月
キー : 4 値 : 4月
キー : 5 値 : 5月
キー : 6 値 : 6月
Sample5
キー : 1
キー : 2
キー : 3
キー : 4
キー : 5
キー : 6
値 : 1月
値 : 2月
値 : 3月
値 : 4月
値 : 5月
値 : 6月
Sample6
キー : 1 値 : 1月
キー : 2 値 : 2月
キー : 3 値 : 3月
キー : 4 値 : 4月
キー : 5 値 : 5月
キー : 6 値 : 6月
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。