HashMapから最初のキーと値を取得する
1. 概要
このチュートリアルでは、キーを知らなくてもHashMapから最初のキーと値のペアを取得する方法について説明します。
最初にイテレータを使用し、次にストリームを使用して最初のエントリを取得します。 最後に、 HashMap が最初のエントリを取得するときに発生する問題と、それを解決する方法について説明します。
2. イテレータの使用
次のものがあると考えてみましょう HashMap
Map<Integer, String> hashMap = new HashMap<>();
hashMap.put(5, "A");
hashMap.put(1, "B");
hashMap.put(2, "C");
この例では、 iterator を使用して、最初のキーと値のペアを取得します。 それでは、HashMapのエントリセットにiteratorを作成し、 next()メソッドを呼び出して最初のエントリを取得しましょう。
Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();
Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(1, "B");
assertEquals(expectedValue, actualValue);
3. Javaストリームの使用
もう1つのアプローチは、JavaStreamAPIを使用することです。 エントリセットでストリームを作成し、 findFirst()メソッドを呼び出して最初のエントリを取得しましょう。
Map.Entry<Integer, String> actualValue = hashMap.entrySet()
.stream()
.findFirst()
.get();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(1, "B");
assertEquals(expectedValue, actualValue);
4. 挿入順序の問題
この問題を提示するために、 hashMap を作成した方法を思い出してください。最初のエントリとして、 5 = A のペアが挿入され、次に 1 = B 、最後にが挿入されました。 ] 2 =C。 HashMap のコンテンツを印刷して、これを確認しましょう。
System.out.println(hashMap);
{1=B, 2=C, 5=A}
ご覧のとおり、順序は同じではありません。 HashMapクラスの実装は、挿入順序を保証しません。
次に、hashMapにもう1つの要素を追加しましょう。
hashMap.put(0, "D");
Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();
Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(0, "D");
assertEquals(expectedValue, actualValue);
ご覧のとおり、最初のエントリが再び変更されました(この場合は 0 = D に)。 これは、HashMapが挿入順序を保証しないことも証明しています。
したがって、順序を保持したい場合は、代わりにLinkedHashMapを使用する必要があります:
Map<Integer, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(5, "A");
linkedHashMap.put(1, "B");
linkedHashMap.put(2, "C");
linkedHashMap.put(0, "D");
Iterator<Map.Entry<Integer, String>> iterator = linkedHashMap.entrySet().iterator();
Map.Entry<Integer, String> actualValue = iterator.next();
Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(5, "A");
assertEquals(expectedValue, actualValue);
5. 結論
この短い記事では、HashMapから最初のエントリを取得するためのさまざまなアプローチについて説明しました。
注意すべき最も重要な点は、 HashMap の実装は、挿入の順序を保証しないということです。 したがって、挿入順序を維持することに関心がある場合は、LinkedHashMapを使用する必要があります。
コード例は、GitHubでから入手できます。