Перейти к основному содержимому

Получить первый ключ и значение из HashMap

· 3 мин. чтения

1. Обзор

В этом руководстве мы обсудим, как получить первую пару ключ-значение из HashMap , не зная ключа.

Сначала мы будем использовать итератор, а затем поток, чтобы получить первую запись. Наконец, мы обсудим проблему, которую представляет HashMap , когда мы хотим получить первую запись, и как ее решить.

2. Использование итератора

Предположим, у нас есть следующий HashMap<Integer, String> :

Map<Integer, String> hashMap = new HashMap<>();
hashMap.put(5, "A");
hashMap.put(1, "B");
hashMap.put(2, "C");

В этом примере мы будем использовать итератор для получения первой пары ключ-значение. Итак, давайте создадим итератор для набора записей HashMap и вызовем метод 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

Другой подход заключается в использовании Java Stream API. Давайте создадим поток для набора записей и вызовем метод 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 еще один элемент :

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 .