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から入手できます。