HashMap - отримання значення першого ключа


128

Нижче наведені значення, що містяться в HashMap

statusName {Active=33, Renewals Completed=3, Application=15}

Код Java для отримання першого ключа (тобто Active)

Object myKey = statusName.keySet().toArray()[0];

Як ми можемо зібрати перший ключ "Значення" (тобто 33), я хочу зберігати і "Ключ", і "Значення" в окремій змінній.


9
Ви усвідомлюєте, що HashMapзаписи не упорядковані, і тому "спочатку" можна змінювати кожного разу, коли ви змінюєте карту?
NPE

1
Чи розумієте ви, що в a немає конкретного порядку HashMap? Якщо ви їх взагалі модифікуєте, ви можете отримати результати в абсолютно іншому порядку.
Джон Скіт

Ні, замовлення не гарантується від запуску до запуску, але в тій самій нитці замовлення можна покластися.
hd1

1
@JonSkeet Насправді це дійсно дійсне питання. У Groovy дуже багато випадків, коли ви отримуєте назад структуру, схожу на перелік карт, кожна карта з одним записом. Поки що я не знайшов легкого / очевидного (Groovy) способу роздрукувати всі значення. Якщо ключі постійні, ви можете вивести кожне значення так само, як collection.each {println it.key}, але без постійних ключів це не очевидно, але collection.each {println it.values ​​() [0]} працює ( Уточнення деяких відповідей тут ...).
Білл К

@BillK: Якщо ви знаєте, що на кожній карті є рівно один запис, то це справді інше питання та питання, яке має більше сенсу.
Джон Скіт

Відповіді:


250

Ви можете спробувати це:

 Map<String,String> map = new HashMap<>();
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key = entry.getKey();
 String value = entry.getValue();

Майте на увазі, HashMapне гарантує порядок вставки. Використовуйте a, LinkedHashMapщоб зберегти порядок неушкодженим.

Наприклад:

 Map<String,String> map = new LinkedHashMap<>();
 map.put("Active","33");
 map.put("Renewals Completed","3");
 map.put("Application","15");
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key= entry.getKey();
 String value=entry.getValue();
 System.out.println(key);
 System.out.println(value);

Вихід:

 Active
 33

Я знаю, що це дуже стара відповідь. Це працює для хешмапів з ключем і значенням як рядки. але при спробі того ж з об'єктом для отримання значення помилки кастингу: com.google.gson.internal.LinkedTreeMap cannot be cast to...... мій клас, який я заявив замість Stringв потрібному місці ... не можу знайти відповідь в Інтернеті .. допомогти
Blue Bot

@darthydarth, ви повинні використовувати належний тип залежно від вашого контексту.
Ruchira Gayan Ranaweera

перше супер спасибі за відповідь! не очікував цього ... по-друге, я виявив, що проблема з Generics не збережена під час виконання. врешті-решт, я зламав його навколо, використовуючи Gsonдля перетворення об'єкта значення в а, Stringа потім проаналізував його назад до мого типу класу. Це некрасиво, але я дійсно не міг знайти іншого рішення для того, що так легко зробити іншими мовами (я зараз вивчаю Яву)
Blue Bot

впевнений, але як? це занадто багато для розділу коментарів
Blue Bot

@darthydarth ви можете надіслати мені електронний лист. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

65

Щоб отримати "перше" значення:

map.values().toArray()[0]

Щоб отримати значення "першого" ключа:

map.get(map.keySet().toArray()[0])

Примітка. Вище перевірений код працює і працює.

Я кажу "спочатку", оскільки записи HashMap не впорядковані.

Однак LinkedHashMap повторює записи в тому ж порядку, що і вони були вставлені - ви можете використовувати це для своєї реалізації карти, якщо важливий порядок вставки.


спершу потрібно перевірити, чи карта не порожня
ACV

48

Java 8 спосіб виконання,

String firstKey = map.keySet().stream().findFirst().get();


якщо у нас є ключ, отримайте перше значення за допомогою map.get (firstKey). Просто натяк. :)
Upen

7

Ви також можете спробувати це, щоб отримати весь перший запис,

Map.Entry<String, String> entry = map.entrySet().stream().findFirst().get();
String key = entry.getKey();
String value = entry.getValue();

Це отримає лише ключ першого запису,

String key = map.entrySet().stream().map(Map.Entry::getKey).findFirst().get();
// or better
String key = map.keySet().stream().findFirst().get();

Це отримає лише значення першого запису,

String value = map.entrySet().stream().map(Map.Entry::getValue).findFirst().get();
// or better
String value = map.values().stream().findFirst().get();

Крім того, якщо ви знаєте, що ви робите, і хочете отримати другий (те саме для третього тощо) елемент карти, ви повинні спробувати це,

Map.Entry<String, String> entry = map.entrySet().stream().skip(1).findFirst().get();
String key = map.keySet().stream().skip(1).findFirst().get();
String value = map.values().stream().skip(1).findFirst().get();

4

як ми можемо зібрати перший ключ "Значення" (тобто 33)

Використовуючи youMap.get(keyYouHave), ви можете отримати його значення.

хочуть зберегти обидва "ключ" і "значення" в окремій змінній

Так, ви можете призначити це змінній.

Зачекайте ......... це ще не закінчено.

Якщо ви (бізнес-логіка) залежати від порядку вставки та отримання, ви побачите дивні результати. Карта не впорядкована, вони не зберігатимуть замовлення. Будь ласка, пам’ятайте про цей факт. Скористайтеся якоюсь альтернативою, щоб зберегти своє замовлення. Ймовірно, aLinkedHashMap


2

Зауважте, що вам слід зауважити, що ваш логічний потік ніколи не повинен покладатися на доступ до HashMapелементів у певному порядку, просто кажучи, тому що HashMaps не є упорядкованими Collections, і це не те, на що вони спрямовані. (Більше про колекції одягу та сортування ви можете прочитати у цій публікації ).

Повернувшись до публікації, ви вже виконали половину завдання, завантаживши перший елемент елемента:

Object myKey = statusName.keySet().toArray()[0];

Просто зателефонуйте, map.get(key)щоб отримати відповідне значення:

Object myValue = statusName.get(myKey);

1

Пам'ятайте, що порядок вставки не дотримується на карті загалом. Спробуйте це :

    /**
     * Get the first element of a map. A map doesn't guarantee the insertion order
     * @param map
     * @param <E>
     * @param <K>
     * @return
     */
    public static <E,K> K getFirstKeyValue(Map<E,K> map){
        K value = null;
        if(map != null && map.size() > 0){
            Map.Entry<E,K> entry =  map.entrySet().iterator().next();
            if(entry != null)
                value = entry.getValue();
        }
        return  value;
    }

Я використовую це лише тоді, коли впевнений, що це map.size() == 1.


1

Удосконалення відповіді онімі. Оскільки findFirst()повертає an Optional, це хороша практика перевірити, чи є значення.

 var optional = pair.keySet().stream().findFirst();

 if (!optional.isPresent()) {
    return;
 }

 var key = optional.get();

Крім того, деякі зауважували, що знайти перший ключ a HashSetє недостовірним. Але іноді у нас є HashMapпари; тобто в кожній карті є один ключ і одне значення. У таких випадках швидко знайти перший ключ такої пари.


0

Також приємний спосіб зробити це :)

Map<Integer,JsonObject> requestOutput = getRequestOutput(client,post);
int statusCode = requestOutput.keySet().stream().findFirst().orElseThrow(() -> new RuntimeException("Empty"));

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.