Java でインターフェイスを実装するオブジェクトがあり、そのMap
中に含まれるすべてのペアを反復処理したい場合、マップを通過する最も効率的な方法は何ですか?
要素の順序は、インターフェイス用に使用している特定のマップの実装に依存しますか?
Java でインターフェイスを実装するオブジェクトがあり、そのMap
中に含まれるすべてのペアを反復処理したい場合、マップを通過する最も効率的な方法は何ですか?
要素の順序は、インターフェイス用に使用している特定のマップの実装に依存しますか?
Map<String, String> map = ...
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "/" + entry.getValue());
}
Java 10 以降の場合:
for (var entry : map.entrySet()) {
System.out.println(entry.getKey() + "/" + entry.getValue());
}
他の回答を要約し、それらを私が知っていることと組み合わせるために、これを行うための 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ストリーム 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
すべてのテストはGitHubにあります。
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
andの型はv
コンパイラによって推測されるため、これ以上使用する必要はありMap.Entry
ません。
簡単!
はい、順序は特定の Map 実装によって異なります。
@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();
// ...
}
マップを反復処理するための一般的なコードは次のとおりです。
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
イテレータとジェネリックの使用例:
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();
// ...
}
これは2つの部分からなる質問です。
マップのエントリを反復処理する方法-@ScArcher2はそれに完全に答えています。
反復の順序は何ですか-を使用しているだけの場合Map
、厳密に言えば、順序の保証はありません。したがって、実装によって与えられた順序に実際に依存するべきではありません。ただし、SortedMap
インターフェイスは拡張Map
され、探しているものを正確に提供します。実装により、一貫した並べ替え順序が提供されます。
NavigableMap
もう1つの便利な拡張機能です。これはSortedMap
、キーセット内の順序付けられた位置によってエントリを検索するための追加のメソッドを備えています。したがって、これにより、最初から反復する必要がなくなる可能性があります。、、、、、またはメソッドentry
を使用した後、higherEntry
特定のメソッドを見つけることができる場合があります。このメソッドは、トラバーサル順序を逆にする明示的なメソッドも提供します。lowerEntry
ceilingEntry
floorEntry
descendingMap
マップを反復処理するにはいくつかの方法があります。
これは、100 万個のキーと値のペアを map に格納し、map を反復処理することによって、map に格納された一般的なデータ セットのパフォーマンスを比較したものです。
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
ました。
参考までに、マップのキー/値のみに関心があり、他のキー/値には関心がない場合は、をmap.keySet()
使用することもできます。map.values()
これを行う正しい方法は、最も効率的であるため、受け入れられた回答を使用することです。次のコードは少しきれいに見えます。
for (String key: map.keySet()) {
System.out.println(key + "/" + map.get(key));
}
Java 8では、 forEach とラムダ式を使用して Map を反復できます。
map.forEach((k, v) -> System.out.println((k + ":" + v)));
Eclipse Collectionsでは、およびインターフェースとその実装によって継承される インターフェースで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 コレクションのコミッターです。
理論的には、最も効率的な方法は Map の実装によって異なります。これを行う公式の方法は、 を呼び出すことです。これは、それぞれがキーと値 (および) を含むmap.entrySet()
のセットを返します。Map.Entry
entry.getKey()
entry.getValue()
map.keySet()
特異な実装では、 を使用するか、map.entrySet()
他の何かを使用するかによって、多少の違いが生じる場合があります。しかし、なぜそのように書くのか、理由が思い浮かびません。ほとんどの場合、何を行ってもパフォーマンスに違いはありません。
はい、順序は実装に依存します。また、(おそらく) 挿入の順序やその他の制御が難しい要因にも依存します。
[編集] 私は最初に書いvalueSet()
たが、もちろんentrySet()
実際には答えだ。
ラムダ式 Java 8
Java 1.8 (Java 8) では、 Iterable Interfaceのイテレーターに似た集約操作 (ストリーム操作) のforEachメソッドを使用することで、これがはるかに簡単になりました。
以下のステートメントをコピーしてコードに貼り付け、 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.
以下はLambda Expressionを使用して試したサンプル コードです。このようなものはとてもクールです。しようとする必要があります。
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
また、同じためにSpliteratorを使用することもできます。
Spliterator sit = hm.entrySet().spliterator();
アップデート
Oracle Docsへのドキュメント・リンクを含めます。Lambdaの詳細については、このリンクにアクセスして、 Aggregate Operationsをお読みください。Spliterator については、このリンクにアクセスしてください。
ラムダ式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();
});
詳細については、こちらに従ってください。
Java 1.4 でこれを試してください:
for( Iterator entries = myMap.entrySet().iterator(); entries.hasNext();){
Entry entry = (Entry) entries.next();
System.out.println(entry.getKey() + "/" + entry.getValue());
//...
}
順序は常に特定のマップの実装に依存します。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,
汎用の型指定されていない Map がある場合は、次を使用できます。
Map map = new HashMap();
for (Map.Entry entry : ((Set<Map.Entry>) map.entrySet())) {
System.out.println(entry.getKey() + "/" + entry.getValue());
}
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();
}
}
}
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry element = (Map.Entry)it.next();
LOGGER.debug("Key: " + element.getKey());
LOGGER.debug("value: " + element.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());
}
//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();
}
はい、多くの人が同意したように、これが a を反復処理する最良の方法Map
です。
nullpointerexception
しかし、マップが の場合、投げるチャンスがありnull
ます。null
.check inを入れることを忘れないでください。
|
|
- - - -
|
|
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
}
これらはすべて、HashMap を反復する可能な方法です。
HashMap<Integer,String> map=new HashMap<Integer,String>();
map.put(1,"David"); //Adding elements in Map
map.put(2,"John");
map.put(4,"Samyuktha");
map.put(3,"jasmin");
System.out.println("Iterating Hashmap...");
//way 1 (java 8 Method)
map.forEach((key, value) -> {
System.out.println(key+" : "+ value);
});
//way 2 (java 7 Method)
for(Map.Entry me : map.entrySet()){
System.out.println(me.getKey()+" "+me.getValue());
}
//way 3 (Legacy type to iterate HashMap)
Iterator iterator = map.entrySet().iterator();//map.keySet().iterator()
while (iterator.hasNext())
{
Map.Entry me =(Map.Entry)iterator.next();
System.out.println(me.getKey()+" : "+ me.getValue());
}
}
マップを反復する方法はいくつかあります。次のコードを参照してください。
iterator Interface を使用してマップを反復するときは、Entry<K,V>
またはを使用する必要がありますentrySet()
。
次のようになります。
import java.util.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class IteratMapDemo{
public static void main(String arg[]){
Map<String, String> mapOne = new HashMap<String, String>();
mapOne.put("1", "January");
mapOne.put("2", "February");
mapOne.put("3", "March");
mapOne.put("4", "April");
mapOne.put("5", "May");
mapOne.put("6", "June");
mapOne.put("7", "July");
mapOne.put("8", "August");
mapOne.put("9", "September");
mapOne.put("10", "Octomber");
mapOne.put("11", "November");
mapOne.put("12", "December");
Iterator it = mapOne.entrySet().iterator();
while(it.hasNext())
{
Map.Entry me = (Map.Entry) it.next();
//System.out.println("Get Key through While loop = " + me.getKey());
}
for(Map.Entry<String, String> entry:mapOne.entrySet()){
//System.out.println(entry.getKey() + "=" + entry.getValue());
}
for (Object key : mapOne.keySet()) {
System.out.println("Key: " + key.toString() + " Value: " +
mapOne.get(key));
}
}
}
要素が追加された順序でマップを反復処理する場合は、LinkedHashMap
単に ではなく を使用しMap
ます。
このアプローチは、過去に私のために働いていました:
LinkedHashMap<String,Integer> test=new LinkedHashMap();
test.put("foo",69);
test.put("bar",1337);
for(int i=0;i<test.size();i++){
System.out.println(test.get(test.keySet().toArray()[i]));
}
出力:
69
1337
OPの質問には完全には答えていませんが、このページを見つけた他の人には役立つかもしれません:
キーではなく値のみが必要な場合は、次のようにします。
Map<Ktype, Vtype> myMap = [...];
for (Vtype v: myMap.values()) {
System.out.println("value: " + v);
}
Ktype
、Vtype
疑似コードです。
Map<String, String> map =
for (Map.Entry<String, String> entry : map.entrySet()) {
MapKey = entry.getKey()
MapValue = entry.getValue();
}
キーを検索できます。マップには一意のキーがあるため、キーを使用してマップの関連付けられた値を見つけることができます。ここまたはここでキーが重複するとどうなるかを確認してください。
デモマップ:
Map<String, String> map = new HashMap();
map.put("name", "Name");
map.put("age", "23");
map.put("address", "NP");
map.put("faculty", "BE");
map.put("major", "CS");
map.put("head", "MDK");
map.keySet();
キーのみを取得するには、次のように使用できます。
for(String key : map.keySet()) {
System.out.println(key);
}
map.values();
値のみを取得するには、次のように使用できます。
for(String value : map.values()) {
System.out.println(value);
}
map.keySet();
キーとその値の両方を取得するには、次のように、対応する値を引き続き使用して取得できます。
//this prints the key value pair
for (String k : map.keySet()) {
System.out.println(k + " " + map.get(k) + " ");
}
map.get(key)
そのキーが指す値を返します。
これは私が信じている最も簡単な方法です...
/* For example, this could be a map object */
Map<String, Integer> MAP = new Map<>();
// Do something like put keys/value pairs into the map, etc...
MAP.put("Denver", 35);
MAP.put("Patriots", 14);
/* Then, simply use a for each loop like this to iterate */
for (Object o : MAP.entrySet()) {
Map.Entry pair = (Map.Entry) o;
// Do whatever with the pair here (i.e. pair.getKey(), or pair.getValue();
}
次のコードを使用して、マップのデータを別のマップにコピーしました。
HashMap product =(HashMap)shopping_truck.get(i);
HashMap tmp = new HashMap();
for (Iterator it = product.entrySet().iterator(); it.hasNext();) {
Map.Entry thisEntry = (Map.Entry) it.next();
tmp.put(thisEntry.getKey(), thisEntry.getValue());
}