HashMap - получение значения первого ключа

129

Ниже приведены значения, содержащиеся в HashMap.

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

Код Java для получения первого ключа (т.е. активного)

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

Как мы можем собрать первое «значение» ключа (т.е. 33), я хочу сохранить и «ключ», и «значение» в отдельной переменной.

Prabu
источник
9
Вы понимаете, что HashMapзаписи неупорядочены, и поэтому "первый" может изменяться всякий раз, когда вы изменяете карту?
NPE
1
Вы понимаете, что в a нет определенного порядка HashMap? Если вы его вообще измените, вы можете получить результаты в совершенно другом порядке.
Джон Скит
Нет, порядок не гарантируется от запуска к запуску, но в одном потоке можно полагаться на порядок.
hd1
1
@JonSkeet На самом деле это действительно актуальный вопрос. В Groovy есть много случаев, когда вы возвращаете структуру, которая выглядит как список карт, каждая карта с одной записью. До сих пор я не нашел простого / очевидного (Groovy) способа распечатать все значения. Если ключи постоянные, распечатать каждое значение так же просто, как collection.each {println it.key}, но без постоянных ключей это не очевидно, но collection.each {println it.values ​​() [0]} работает ( Уточнение некоторых ответов здесь ...).
Bill K
@BillK: Если вы знаете, что на каждой карте есть ровно одна запись, то на самом деле это другой вопрос, и он имеет больше смысла.
Джон Скит,

Ответы:

251

Вы можете попробовать это:

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

Имейте в виду, HashMapчто порядок размещения не гарантируется. Используйте 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, вы должны использовать правильный тип в зависимости от вашего контекста.
Ручира Гаян Ранауэра
во-первых супер спасибо за ответ! не ожидал этого ... во-вторых, я обнаружил, что есть проблема с Generics, не сохраненными во время выполнения. в конце концов я взломал его, используя Gsonдля преобразования объекта значения в a, Stringа затем проанализировал его обратно в мой тип класса. Это уродливо, но я действительно не мог найти другого решения для того, что так легко сделать на других языках (сейчас я изучаю Java)
Blue Bot
конечно, но как? это слишком для раздела комментариев
Blue Bot
@darthydarth, вы можете отправить мне электронное письмо. ruchiragayan@gmail.com
Ручира Гаян Ранауэра
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), вы можете получить от этого ценность.

хотите сохранить "Ключ" и "Значение" в отдельной переменной

Да, вы можете присвоить это переменной.

Подожди ......... это еще не конец.

Если вы (бизнес-логика) зависите от порядка вставки и извлечения, вы увидите странные результаты. Карта не заказана, они не будут храниться в заказе. Помните об этом факте. Воспользуйтесь альтернативой, чтобы сохранить свой порядок. Наверное,LinkedHashMap

Суреш Атта
источник
2

Обратите внимание, что вы должны отметить, что ваш логический поток никогда не должен полагаться на доступ к HashMapэлементам в каком-либо порядке, просто потому, что HashMaps не упорядочены, Collectionи это не то, для чего они предназначены. (Вы можете узнать больше о заказанных и сортировочных коллекциях в этом посте ).

Возвращаясь к посту, вы уже выполнили половину работы, загрузив первый ключ элемента:

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

Просто позвоните, map.get(key)чтобы получить соответствующее значение:

Object myValue = statusName.get(myKey);
tmarwen
источник
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

Улучшение ответа whoami. Поскольку findFirst()возвращает значение 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"));
Адриан
источник
-2

Вы также можете попробовать следующее:

Map.Entry<String, Integer> entry = myMap.firstEntry();
System.out.println("First Value = " + entry);
Веера
источник
1
Нет такого метода
Адриан Григутис