Map
Javaでインターフェースを実装するオブジェクトがあり、その中に含まれるすべてのペアを反復処理したい場合、マップを通過する最も効率的な方法は何ですか?
要素の順序は、インターフェイスにある特定のマップ実装に依存しますか?
Map
Javaでインターフェースを実装するオブジェクトがあり、その中に含まれるすべてのペアを反復処理したい場合、マップを通過する最も効率的な方法は何ですか?
要素の順序は、インターフェイスにある特定のマップ実装に依存しますか?
回答:
Map<String, String> map = ...
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "/" + entry.getValue());
}
remove
メソッドを呼び出す必要がある場合です。その場合は、この別の回答でその方法を示します。それ以外の場合は、上記の回答に示されている拡張ループが適切です。
map.values()
またはmap.keySet()
値またはキーのみをループする場合に使用できます。
他の回答を要約し、それらを私が知っていることと組み合わせるために、これを行う10の主な方法を見つけました(以下を参照)。また、いくつかのパフォーマンステストを作成しました(以下の結果を参照)。たとえば、マップのすべてのキーと値の合計を求めたい場合は、次のように書くことができます。
イテレータとMap.Entryの使用
long i = 0;
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, Integer> pair = it.next();
i += pair.getKey() + pair.getValue();
}
foreachとMap.Entryの使用
long i = 0;
for (Map.Entry<Integer, Integer> pair : map.entrySet()) {
i += pair.getKey() + pair.getValue();
}
Java 8からのforEachの使用
final long[] i = {0};
map.forEach((k, v) -> i[0] += k + v);
keySetとforeachの使用
long i = 0;
for (Integer key : map.keySet()) {
i += key + map.get(key);
}
keySetとイテレーターの使用
long i = 0;
Iterator<Integer> itr2 = map.keySet().iterator();
while (itr2.hasNext()) {
Integer key = itr2.next();
i += key + map.get(key);
}
forおよびMap.Entryの使用
long i = 0;
for (Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); entries.hasNext(); ) {
Map.Entry<Integer, Integer> entry = entries.next();
i += entry.getKey() + entry.getValue();
}
Java 8 Stream APIの使用
final long[] i = {0};
map.entrySet().stream().forEach(e -> i[0] += e.getKey() + e.getValue());
Java 8 Stream APIの並列使用
final long[] i = {0};
map.entrySet().stream().parallel().forEach(e -> i[0] += e.getKey() + e.getValue());
IterableMapの使用Apache Collections
long i = 0;
MapIterator<Integer, Integer> it = iterableMap.mapIterator();
while (it.hasNext()) {
i += it.next() + it.getValue();
}
Eclipse(CS)コレクションのMutableMapの使用
final long[] i = {0};
mutableMap.forEachKeyValue((key, value) -> {
i[0] += key + value;
});
パフォーマンステスト(モード= AverageTime、システム= Windows 8.1 64ビット、Intel i7-4790 3.60 GHz、16 GB)
小さなマップ(100要素)の場合、スコア0.308が最高です
Benchmark Mode Cnt Score Error Units
test3_UsingForEachAndJava8 avgt 10 0.308 ± 0.021 µs/op
test10_UsingEclipseMap avgt 10 0.309 ± 0.009 µs/op
test1_UsingWhileAndMapEntry avgt 10 0.380 ± 0.014 µs/op
test6_UsingForAndIterator avgt 10 0.387 ± 0.016 µs/op
test2_UsingForEachAndMapEntry avgt 10 0.391 ± 0.023 µs/op
test7_UsingJava8StreamApi avgt 10 0.510 ± 0.014 µs/op
test9_UsingApacheIterableMap avgt 10 0.524 ± 0.008 µs/op
test4_UsingKeySetAndForEach avgt 10 0.816 ± 0.026 µs/op
test5_UsingKeySetAndIterator avgt 10 0.863 ± 0.025 µs/op
test8_UsingJava8StreamApiParallel avgt 10 5.552 ± 0.185 µs/op
10000要素のマップの場合、スコア37.606が最高です
Benchmark Mode Cnt Score Error Units
test10_UsingEclipseMap avgt 10 37.606 ± 0.790 µs/op
test3_UsingForEachAndJava8 avgt 10 50.368 ± 0.887 µs/op
test6_UsingForAndIterator avgt 10 50.332 ± 0.507 µs/op
test2_UsingForEachAndMapEntry avgt 10 51.406 ± 1.032 µs/op
test1_UsingWhileAndMapEntry avgt 10 52.538 ± 2.431 µs/op
test7_UsingJava8StreamApi avgt 10 54.464 ± 0.712 µs/op
test4_UsingKeySetAndForEach avgt 10 79.016 ± 25.345 µs/op
test5_UsingKeySetAndIterator avgt 10 91.105 ± 10.220 µs/op
test8_UsingJava8StreamApiParallel avgt 10 112.511 ± 0.365 µs/op
test9_UsingApacheIterableMap avgt 10 125.714 ± 1.935 µs/op
100000要素のマップの場合、スコア1184.767が最高です
Benchmark Mode Cnt Score Error Units
test1_UsingWhileAndMapEntry avgt 10 1184.767 ± 332.968 µs/op
test10_UsingEclipseMap avgt 10 1191.735 ± 304.273 µs/op
test2_UsingForEachAndMapEntry avgt 10 1205.815 ± 366.043 µs/op
test6_UsingForAndIterator avgt 10 1206.873 ± 367.272 µs/op
test8_UsingJava8StreamApiParallel avgt 10 1485.895 ± 233.143 µs/op
test5_UsingKeySetAndIterator avgt 10 1540.281 ± 357.497 µs/op
test4_UsingKeySetAndForEach avgt 10 1593.342 ± 294.417 µs/op
test3_UsingForEachAndJava8 avgt 10 1666.296 ± 126.443 µs/op
test7_UsingJava8StreamApi avgt 10 1706.676 ± 436.867 µs/op
test9_UsingApacheIterableMap avgt 10 3289.866 ± 1445.564 µs/op
グラフ(マップサイズに応じたパフォーマンステスト)
テーブル(マップサイズに応じたパフォーマンステスト)
100 600 1100 1600 2100
test10 0.333 1.631 2.752 5.937 8.024
test3 0.309 1.971 4.147 8.147 10.473
test6 0.372 2.190 4.470 8.322 10.531
test1 0.405 2.237 4.616 8.645 10.707
test2 0.376 2.267 4.809 8.403 10.910
test7 0.473 2.448 5.668 9.790 12.125
test9 0.565 2.830 5.952 13.220 16.965
test4 0.808 5.012 8.813 13.939 17.407
test5 0.810 5.104 8.533 14.064 17.422
test8 5.173 12.499 17.351 24.671 30.403
long sum = 0; map.forEach( /* accumulate in variable sum*/);
、sum
長いものをキャプチャしstream.mapToInt(/*whatever*/).sum
ます。たとえば、言うよりも遅いかもしれません。もちろん、状態のキャプチャを常に回避できるわけではありませんが、それは合理的な追加になる可能性があります。ベンチに
AtomicInteger
て問題を解決してください。
x±e
、x-e
to からまでの間隔内に結果があったことを意味するx+e
ため、最も速い結果(1184.767±332.968
)は852
toの範囲です1518
が、2番目に遅い(1706.676±436.867
)はとの間1270
で実行される2144
ため、結果は依然として大幅に重なります。次に、最も遅い結果を見てください3289.866±1445.564
。これは1844
、4735
との間で分岐することを意味し、これらのテスト結果は無意味であることがわかります。
while
対for
ループは、反復ごとに異なる技術ではありません。そして、テストでそれらの間にそのようなばらつきがあることに驚いています。これは、テストが、テストしようとしているものとは無関係の外部要因から適切に分離されていないことを示唆しています。
Java 8では、新しいラムダ機能を使用してクリーンで高速に実行できます。
Map<String,String> map = new HashMap<>();
map.put("SomeKey", "SomeValue");
map.forEach( (k,v) -> [do something with key and value] );
// such as
map.forEach( (k,v) -> System.out.println("Key: " + k + ": Value: " + v));
k
およびのタイプはv
コンパイラーによって推測され、使用する必要はありません。Map.Entry
これ以上ません。
かんたん!
map.entrySet().stream()
docs.oracle.com
はい、順序は特定のマップ実装に依存します。
@ ScArcher2には、よりエレガントなJava 1.5構文があります。1.4では、次のようにします。
Iterator entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
Entry thisEntry = (Entry) entries.next();
Object key = thisEntry.getKey();
Object value = thisEntry.getValue();
// ...
}
for
構成をそのまま使用してfor (Entry e : myMap.entrySet)
もコレクションを変更できないことは正しいですが、@ HanuAthenaが言及した例Iterator
ではスコープ内にあるため、機能するはずです。(何か不足している場合を
Entry thisEntry = (Entry) entries.next();
:が認識されませんEntry
。その疑似コードは何か他のものですか?
java.util.Map.Entry
。
マップを反復するための一般的なコードは次のとおりです。
Map<String,Thing> map = ...;
for (Map.Entry<String,Thing> entry : map.entrySet()) {
String key = entry.getKey();
Thing thing = entry.getValue();
...
}
HashMap
正規マップの実装であり、保証はありません(または、変更操作が実行されない場合、順序は変更されません)。SortedMap
は、キーの自然な順序に基づいてエントリを返しますComparator
。LinkedHashMap
構成方法に応じて、エントリを挿入順またはアクセス順で返します。EnumMap
キーの自然な順序でエントリを返します。
(更新:これはもう真実ではないと思います。)注:IdentityHashMap
entrySet
イテレータには現在Map.Entry
、entrySet
!内のすべてのアイテムに対して同じインスタンスを返す固有の実装があります ただし、新しいイテレータが進むたびにMap.Entry
更新されます。
LinkedHashMap
カウントへの直接アクセスのみ。これらを通じてはiterator
、spliterator
、entrySet
、など、順序を変更しないでください。
イテレータとジェネリックスの使用例:
Iterator<Map.Entry<String, String>> entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, String> entry = entries.next();
String key = entry.getKey();
String value = entry.getValue();
// ...
}
Iterator
スコープを制限するためにforループを配置する必要があります。
for (Iterator<Map.Entry<K, V>> entries = myMap.entrySet().iterator(); entries.hasNext(); ) { Map.Entry<K, V> entry = entries.next(); }
。その構造を使用することにより、(変数の可視性)のスコープをentries
forループに制限します。
これは2つの部分からなる質問です。
マップのエントリを反復処理する方法 -@ ScArcher2は完全にそれに答えました。
反復の順序は何ですか?単に使用しているMap
場合、厳密に言うと、順序の保証はありません。そのため、実装によって与えられた順序に実際に依存すべきではありません。ただし、SortedMap
インターフェースは拡張してMap
、まさにあなたが探しているものを提供します-実装は、一貫したソート順を提供します。
NavigableMap
もう1つの便利な拡張機能です。これはSortedMap
、キーセット内の順序付けされた位置でエントリを検索するための追加のメソッドです。だから、潜在的にこれは最初の場所で繰り返し処理の必要性を取り除くことができます-あなたは、特定のを見つけることができるかもしれないentry
あなたが使用した後ですhigherEntry
、lowerEntry
、ceilingEntry
、またはfloorEntry
方法を。このdescendingMap
方法では、走査順序を逆にする明示的な方法も提供されます。
マップを反復する方法はいくつかあります。
これは、100万のキーと値のペアをマップに格納することでマップに格納された一般的なデータセットのパフォーマンスの比較であり、マップを反復処理します。
1)entrySet()
for eachループを使用する
for (Map.Entry<String,Integer> entry : testMap.entrySet()) {
entry.getKey();
entry.getValue();
}
50ミリ秒
2)keySet()
for eachループを使用する
for (String key : testMap.keySet()) {
testMap.get(key);
}
76ミリ秒
3)使用entrySet()
とイテレータ
Iterator<Map.Entry<String,Integer>> itr1 = testMap.entrySet().iterator();
while(itr1.hasNext()) {
Map.Entry<String,Integer> entry = itr1.next();
entry.getKey();
entry.getValue();
}
50ミリ秒
4)使用keySet()
とイテレータ
Iterator itr2 = testMap.keySet().iterator();
while(itr2.hasNext()) {
String key = itr2.next();
testMap.get(key);
}
75ミリ秒
私は言及しましたthis link
。
これを行う正しい方法は、最も効率的であるため、受け入れられた回答を使用することです。次のコードは少しきれいに見えます。
for (String key: map.keySet()) {
System.out.println(key + "/" + map.get(key));
}
O(1) = 2*O(1)
ほぼビッグO表記の定義です。あなたはそれが少し遅いという点で正しいですが、複雑さの点ではそれらは同じです。
2
、を反復してentrySet()
もまったくルックアップが行われないため、係数がでないことを強調する必要があります。これは、すべてのエントリを直線的にたどるだけです。これとは対照的に、反復処理keySet()
し、キークマあたりのルックアップを実行する1件の我々はゼロ対のルックアップの話をしているので、キーごとに検索をn個、ここで検索、n個のサイズですMap
。そのため、要因ははるかに超えてい2
ます…
Eclipseのコレクション、あなたが使用するforEachKeyValue
上での方法をMapIterable
によって継承されるインターフェース、MutableMap
およびImmutableMap
インタフェースとその実装。
MutableBag<String> result = Bags.mutable.empty();
MutableMap<Integer, String> map = Maps.mutable.of(1, "One", 2, "Two", 3, "Three");
map.forEachKeyValue((key, value) -> result.add(key + value));
Assert.assertEquals(Bags.mutable.of("1One", "2Two", "3Three"), result);
匿名の内部クラスを使用すると、次のようにコードを記述できます。
final MutableBag<String> result = Bags.mutable.empty();
MutableMap<Integer, String> map = Maps.mutable.of(1, "One", 2, "Two", 3, "Three");
map.forEachKeyValue(new Procedure2<Integer, String>()
{
public void value(Integer key, String value)
{
result.add(key + value);
}
});
Assert.assertEquals(Bags.mutable.of("1One", "2Two", "3Three"), result);
注:私はEclipseコレクションのコミッターです。
ラムダ式Java 8
Java 1.8(Java 8)では、Iterableのイテレータに似たAggregateオペレーション(Streamオペレーション)のforEachメソッドを使用することで、これがずっと簡単になりました。 Interfaceの。
以下のステートメントをコピーしてコードにコピーし、HashMap変数の名前をhmからHashMap変数に変更して、キーと値のペアを出力します。
HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>();
/*
* Logic to put the Key,Value pair in your HashMap hm
*/
// Print the key value pair in one line.
hm.forEach((k, v) -> System.out.println("key: " + k + " value:" + v));
// Just copy and paste above line to your code.
以下は、ラムダ式を使用して試したサンプルコードです。このものはとてもクールです。しようとする必要があります。
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
Random rand = new Random(47);
int i = 0;
while(i < 5) {
i++;
int key = rand.nextInt(20);
int value = rand.nextInt(50);
System.out.println("Inserting key: " + key + " Value: " + value);
Integer imap = hm.put(key, value);
if( imap == null) {
System.out.println("Inserted");
} else {
System.out.println("Replaced with " + imap);
}
}
hm.forEach((k, v) -> System.out.println("key: " + k + " value:" + v));
Output:
Inserting key: 18 Value: 5
Inserted
Inserting key: 13 Value: 11
Inserted
Inserting key: 1 Value: 29
Inserted
Inserting key: 8 Value: 0
Inserted
Inserting key: 2 Value: 7
Inserted
key: 1 value:29
key: 18 value:5
key: 2 value:7
key: 8 value:0
key: 13 value:11
また、Splitatoratorを使用することもできます。
Spliterator sit = hm.entrySet().spliterator();
更新
Oracle Docsへのドキュメントへのリンクを含みます。Lambdaの詳細については、このリンクにアクセスし、集約操作を読む必要があります。Splitatorについては、このリンクにアクセスしてください。
理論的には、最も効率的な方法は、Mapの実装によって異なります。これを行う正式な方法は、を呼び出すことです。これは、それぞれにキーと値(および)が含まれるのmap.entrySet()
セットを返します。Map.Entry
entry.getKey()
entry.getValue()
特異な実装では、を使用するかどうかによって多少の違いが生じる可能性がありますmap.keySet()
。map.entrySet()
ます。しかし、誰もがそのように書く理由は考えられません。ほとんどの場合、パフォーマンスに影響はありません。
そして、はい、順序は実装に依存します-挿入の順序やその他の制御が困難な要因(同様に)。
[編集]私はvalueSet()
最初に書いたが、もちろんentrySet()
実際はその答えである。
我々は持っているforEach
受け取るメソッドラムダ式を。ストリーム API もあります。地図を考えてみましょう:
Map<String,String> sample = new HashMap<>();
sample.put("A","Apple");
sample.put("B", "Ball");
キーを反復する:
sample.keySet().forEach((k) -> System.out.println(k));
値を反復する:
sample.values().forEach((v) -> System.out.println(v));
エントリを反復処理します(forEachおよびStreamsを使用):
sample.forEach((k,v) -> System.out.println(k + ":" + v));
sample.entrySet().stream().forEach((entry) -> {
Object currentKey = entry.getKey();
Object currentValue = entry.getValue();
System.out.println(currentKey + ":" + currentValue);
});
ストリームの利点は、必要に応じて簡単に並列化できることです。上記のparallelStream()
代わりに使用するだけですstream()
。
forEachOrdered
対forEach
ストリーム?forEach
(定義されている場合)の出会いの順序をたどるとして自然の中で本質的に非決定的ではありませんforEachOrdered
ありません。したがってforEach
、注文が保持されることは保証されません。また、チェックこれを多くのため。
Java 8:
ラムダ式を使用できます。
myMap.entrySet().stream().forEach((entry) -> {
Object currentKey = entry.getKey();
Object currentValue = entry.getValue();
});
詳細については、こちらに従ってください。
myMap.forEach( (currentKey,currentValue) -> /* action */ );
はるかに簡潔です。
地図では1オーバーの繰り返しができkeys
、および/またはvalues
および/またはboth (e.g., entrySet)
同様の1興味IN_によって異なります。
keys -> keySet()
マップのを反復処理します。
Map<String, Object> map = ...;
for (String key : map.keySet()) {
//your Business logic...
}
values -> values()
マップのを反復処理します。
for (Object value : map.values()) {
//your Business logic...
}
both -> entrySet()
マップのを反復処理します。
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
//your Business logic...
}
_さらに、HashMapを反復処理するには3つの異なる方法があります。彼らは以下の通りです__
//1.
for (Map.Entry entry : hm.entrySet()) {
System.out.print("key,val: ");
System.out.println(entry.getKey() + "," + entry.getValue());
}
//2.
Iterator iter = hm.keySet().iterator();
while(iter.hasNext()) {
Integer key = (Integer)iter.next();
String val = (String)hm.get(key);
System.out.println("key,val: " + key + "," + val);
}
//3.
Iterator it = hm.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
Integer key = (Integer)entry.getKey();
String val = (String)entry.getValue();
System.out.println("key,val: " + key + "," + val);
}
public class abcd{
public static void main(String[] args)
{
Map<Integer, String> testMap = new HashMap<Integer, String>();
testMap.put(10, "a");
testMap.put(20, "b");
testMap.put(30, "c");
testMap.put(40, "d");
for (Integer key:testMap.keySet()) {
String value=testMap.get(key);
System.out.println(value);
}
}
}
または
public class abcd {
public static void main(String[] args)
{
Map<Integer, String> testMap = new HashMap<Integer, String>();
testMap.put(10, "a");
testMap.put(20, "b");
testMap.put(30, "c");
testMap.put(40, "d");
for (Entry<Integer, String> entry : testMap.entrySet()) {
Integer key=entry.getKey();
String value=entry.getValue();
}
}
}
JavaでMapインターフェースを実装するオブジェクトがあり、その中に含まれるすべてのペアを反復処理したい場合、マップを通過する最も効率的な方法は何ですか?
キーをループする効率がアプリの優先事項でMap
ある場合は、キーを希望の順序で維持する実装を選択します。
要素の順序は、インターフェイスにある特定のマップ実装に依存しますか?
そのとおり。
Map
特定の反復順序を約束する実装もあれば、そうしない実装もあります。Map
は、キーと値のペアの順序が異なります。Map
Java 11にバンドルされているさまざまな実装を要約して作成したこの表を参照してください。特に、反復順序の列に注目してください。クリック/タップしてズームします。
順序を維持する4つのMap
実装があることがわかります。
TreeMap
ConcurrentSkipListMap
LinkedHashMap
EnumMap
NavigableMap
インターフェースそれらの2つはNavigableMap
インターフェースを実装します:TreeMap
&ConcurrentSkipListMap
。
古いSortedMap
インターフェイスは、新しいNavigableMap
インターフェイスに実質的に取って代わられました。ただし、古いインターフェースのみを実装するサードパーティの実装が見つかる場合があります。
あなたがしたい場合はMap
、そのペアがキー、使用の「自然順」で配置され続けていますTreeMap
かConcurrentSkipListMap
。「自然順序」という用語は、キーの実装のクラスを意味しますComparable
。によって返される値compareTo
メソッド、並べ替えの比較に使用されます。
並べ替え順序の維持に使用するキーのカスタム並べ替えルーチンを指定する場合Comparator
は、キーのクラスに適した実装を渡します。TreeMap
またはを使用してConcurrentSkipListMap
、を渡しますComparator
。
マップのペアを、マップに挿入したときの元の順序で保持する場合は、を使用しますLinkedHashMap
。
DayOfWeek
またはMonth
キーとして列挙型を使用している場合は、EnumMap
クラスを使用します。このクラスは非常に少ないメモリを使用して非常に高速に実行するように高度に最適化されているだけでなく、列挙型によって定義された順序でペアを維持します。たとえばDayOfWeek
、のキーはDayOfWeek.MONDAY
反復時に最初に見つかり、キーはDayOfWeek.SUNDAY
最後なります。
Map
実装を選択する際には、以下も考慮してください。
Collections::synchronizedMap
(あまり好ましくない)でラップします。これらの考慮事項はどちらも、上の図の表で説明されています。
EnumMap
したのは初めてです。聞いたのは初めてです。これが役立つ場合はおそらく多くあります。
順序は常に特定のマップ実装に依存します。Java 8を使用すると、次のいずれかを使用できます。
map.forEach((k,v) -> { System.out.println(k + ":" + v); });
または:
map.entrySet().forEach((e) -> {
System.out.println(e.getKey() + " : " + e.getValue());
});
結果は同じになります(同じ順序)。同じ順序で取得できるように、マップに対応するentrySet。2つ目は、ラムダを使用できるため便利です。たとえば、5より大きいIntegerオブジェクトのみを印刷する場合は、次のようにします。
map.entrySet()
.stream()
.filter(e-> e.getValue() > 5)
.forEach(System.out::println);
以下のコードは、LinkedHashMapと通常のHashMap(例)による反復を示しています。順序に違いがあります:
public class HMIteration {
public static void main(String[] args) {
Map<Object, Object> linkedHashMap = new LinkedHashMap<>();
Map<Object, Object> hashMap = new HashMap<>();
for (int i=10; i>=0; i--) {
linkedHashMap.put(i, i);
hashMap.put(i, i);
}
System.out.println("LinkedHashMap (1): ");
linkedHashMap.forEach((k,v) -> { System.out.print(k + " (#="+k.hashCode() + "):" + v + ", "); });
System.out.println("\nLinkedHashMap (2): ");
linkedHashMap.entrySet().forEach((e) -> {
System.out.print(e.getKey() + " : " + e.getValue() + ", ");
});
System.out.println("\n\nHashMap (1): ");
hashMap.forEach((k,v) -> { System.out.print(k + " (#:"+k.hashCode() + "):" + v + ", "); });
System.out.println("\nHashMap (2): ");
hashMap.entrySet().forEach((e) -> {
System.out.print(e.getKey() + " : " + e.getValue() + ", ");
});
}
}
LinkedHashMap(1):
10(#= 10):10、9(#= 9):9、8(#= 8):8、7(#= 7):7、6(#= 6):6、5(#= 5 ):5、4(#= 4):4、3(#= 3):3、2(#= 2):2、1(#= 1):1、0(#= 0):0、
LinkedHashMap(2):
10:10、9:9、8:8、7:7、6:6、5:5、4:4、3:3、2:2、1:1、0:0、
HashMap(1):
0(#:0):0、1(#:1):1、2(#:2):2、3(#:3):3、4(#:4):4、5(#:5 ):5、6(#:6):6、7(#:7):7、8(#:8):8、9(#:9):9、10(#:10):10、
HashMap(2):
0:0、1:1、2:2、3:3、4:4、5:5、6:6、7:7、8:8、9:9、10:10
Java 8を使用:
map.entrySet().forEach(entry -> System.out.println(entry.getValue()));
あなたはジェネリックを使用してそれを行うことができます:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
Mapに対する効果的な反復ソリューションは、Java 5からJava 7までの「for each」ループです。ここでは次のようになります。
for (String key : phnMap.keySet()) {
System.out.println("Key: " + key + " Value: " + phnMap.get(key));
}
Java 8以降では、ラムダ式を使用してマップを反復できます。拡張された「forEach」です
phnMap.forEach((k,v) -> System.out.println("Key: " + k + " Value: " + v));
ラムダの条件を記述したい場合は、次のように記述できます。
phnMap.forEach((k,v)->{
System.out.println("Key: " + k + " Value: " + v);
if("abc".equals(k)){
System.out.println("Hello abc");
}
});
//Functional Oprations
Map<String, String> mapString = new HashMap<>();
mapString.entrySet().stream().map((entry) -> {
String mapKey = entry.getKey();
return entry;
}).forEach((entry) -> {
String mapValue = entry.getValue();
});
//Intrator
Map<String, String> mapString = new HashMap<>();
for (Iterator<Map.Entry<String, String>> it = mapString.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, String> entry = it.next();
String mapKey = entry.getKey();
String mapValue = entry.getValue();
}
//Simple for loop
Map<String, String> mapString = new HashMap<>();
for (Map.Entry<String, String> entry : mapString.entrySet()) {
String mapKey = entry.getKey();
String mapValue = entry.getValue();
}
これを行う方法はたくさんあります。以下にいくつかの簡単な手順を示します。
次のような1つのマップがあるとします。
Map<String, Integer> m = new HashMap<String, Integer>();
次に、以下のようにしてマップ要素を反復処理できます。
// ********** Using an iterator ****************
Iterator<Entry<String, Integer>> me = m.entrySet().iterator();
while(me.hasNext()){
Entry<String, Integer> pair = me.next();
System.out.println(pair.getKey() + ":" + pair.getValue());
}
// *********** Using foreach ************************
for(Entry<String, Integer> me : m.entrySet()){
System.out.println(me.getKey() + " : " + me.getValue());
}
// *********** Using keySet *****************************
for(String s : m.keySet()){
System.out.println(s + " : " + m.get(s));
}
// *********** Using keySet and iterator *****************
Iterator<String> me = m.keySet().iterator();
while(me.hasNext()){
String key = me.next();
System.out.println(key + " : " + m.get(key));
}
package com.test;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("ram", "ayodhya");
map.put("krishan", "mathura");
map.put("shiv", "kailash");
System.out.println("********* Keys *********");
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key);
}
System.out.println("********* Values *********");
Collection<String> values = map.values();
for (String value : values) {
System.out.println(value);
}
System.out.println("***** Keys and Values (Using for each loop) *****");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + "\t Value: "
+ entry.getValue());
}
System.out.println("***** Keys and Values (Using while loop) *****");
Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry<String, String>) entries
.next();
System.out.println("Key: " + entry.getKey() + "\t Value: "
+ entry.getValue());
}
System.out
.println("** Keys and Values (Using java 8 using lambdas )***");
map.forEach((k, v) -> System.out
.println("Key: " + k + "\t value: " + v));
}
}