HashMap - pobieranie wartości pierwszego klucza


129

Poniżej znajdują się wartości zawarte w HashMap

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

Kod Java do uzyskania pierwszego klucza (tj. Aktywnego)

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

Jak możemy zebrać pierwszy klucz „Wartość” (tj. 33), chcę przechowywać zarówno „Klucz”, jak i „Wartość” w osobnej zmiennej.


9
Czy zdajesz sobie sprawę, że HashMapwpisy są nieuporządkowane, więc „pierwszy” może się zmienić za każdym razem, gdy zmodyfikujesz mapę?
NPE

1
Czy rozumiesz, że nie ma określonej kolejności w HashMap? Jeśli w ogóle go zmodyfikujesz, możesz uzyskać wyniki w zupełnie innej kolejności.
Jon Skeet,

Nie, kolejność nie jest gwarantowana od uruchomienia do uruchomienia, ale w ramach tego samego wątku można polegać na kolejności.
hd1

1
@JonSkeet Właściwie to jest naprawdę ważne pytanie. W Groovy jest wiele przypadków, w których otrzymujesz strukturę, która wygląda jak lista map, każda mapa z jednym wpisem. Jak dotąd nie znalazłem łatwego / oczywistego (Groovy) sposobu na wydrukowanie wszystkich wartości. Jeśli klucze są stałe, wydrukowanie każdej wartości jest tak proste, jak collection.each {println it.key}, ale bez stałych kluczy nie jest to oczywiste, ale collection.each {println it.values ​​() [0]} działa ( Doprecyzowanie niektórych odpowiedzi tutaj ...).
Bill K

@BillK: Jeśli wiesz, że każda mapa ma dokładnie jeden wpis, to w rzeczywistości jest to inne pytanie, które ma więcej sensu.
Jon Skeet

Odpowiedzi:


251

Możesz spróbować tego:

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

Pamiętaj, HashMapże nie gwarantuje realizacji zamówienia reklamowego. Użyj a, LinkedHashMapaby zachować porządek.

Na przykład:

 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);

Wynik:

 Active
 33

Wiem, że to bardzo stara odpowiedź ... to działa dla hashmap z kluczem i wartością jako ciągami. ale kiedy próbuję tego samego z obiektem dla wartości, otrzymując błąd rzutowania: com.google.gson.internal.LinkedTreeMap cannot be cast to...... moja klasa, którą Stringpodałem zamiast we właściwym miejscu ... nie mogę znaleźć odpowiedzi online ... pomoc
Blue Bot

@darthydarth powinieneś użyć odpowiedniego typu w zależności od kontekstu.
Ruchira Gayan Ranaweera

pierwsze super dzięki za odpowiedź! nie spodziewałem się tego ... po drugie, odkryłem, że jest problem z generykami, które nie zostały zapisane w czasie wykonywania. w końcu zhakowałem to, używając Gsondo konwersji obiektu wartości na a, Stringa następnie przeanalizowałem go z powrotem do mojego typu klasy. To brzydkie, ale naprawdę nie mogłem znaleźć żadnego innego rozwiązania dla czegoś, co jest tak łatwe do zrobienia w innych językach (teraz uczę się Javy)
Blue Bot

jasne, ale jak? to za dużo dla sekcji komentarzy
Blue Bot

@darthydarth możesz wysłać mi e-mail. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

65

Aby uzyskać „pierwszą” wartość:

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

Aby uzyskać wartość „pierwszego” klucza:

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

Uwaga: powyższy kod został przetestowany i działa.

Mówię „pierwszy”, ponieważ wpisy HashMap nie są uporządkowane.

Jednak LinkedHashMap iteruje swoje wpisy w tej samej kolejności, w jakiej zostały wstawione - możesz tego użyć do implementacji mapy, jeśli kolejność wstawiania jest ważna.


najpierw musisz sprawdzić, czy mapa nie jest pusta
ACV

48

Sposób działania Java 8,

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


jeśli mamy klucz, pobierz pierwszą wartość za pomocą map.get (firstKey). Tylko podpowiedź. :)
Upen

7

Możesz również spróbować tego, aby uzyskać cały pierwszy wpis,

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

Ma to na celu uzyskanie tylko klucza pierwszego wpisu,

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

Ma to na celu pobranie tylko wartości pierwszego wpisu,

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

Ponadto, jeśli wiesz, co robisz i chcesz otrzymać drugi (taki sam dla trzeciego itp.) Element mapy, powinieneś spróbować tego,

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

jak możemy zebrać pierwszy klucz „Wartość” (tj. 33)

Używając youMap.get(keyYouHave), możesz uzyskać jego wartość.

chcesz przechowywać „Klucz” i „Wartość” w osobnej zmiennej

Tak, możesz to przypisać do zmiennej.

Poczekaj… to nie koniec.

Jeśli (logika biznesowa) zależy od kolejności wstawiania i pobierania, zobaczysz dziwne wyniki. Mapa nie jest uporządkowana, nie będzie przechowywana w zamówieniu. Pamiętaj o tym. Skorzystaj z alternatywy, aby zachować swoje zamówienie. PrawdopodobnieLinkedHashMap


2

Zauważ, że powinieneś zauważyć, że twój przepływ logiczny nigdy nie może polegać na dostępie do HashMapelementów w jakiejś kolejności, po prostu mówiąc, ponieważ HashMaps nie są uporządkowane Collectioni nie jest to ich celem. (Możesz przeczytać więcej o kolekcjach odered i sorter w tym poście ).

Wracając do postu, wykonałeś już połowę pracy, ładując klucz pierwszego elementu:

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

Wystarczy zadzwonić, map.get(key)aby uzyskać odpowiednią wartość:

Object myValue = statusName.get(myKey);

1

Pamiętaj, że generalnie na mapie nie jest przestrzegana kolejność reklam. Spróbuj tego :

    /**
     * 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;
    }

Używam tego tylko wtedy, gdy jestem tego pewien map.size() == 1.


1

Poprawianie odpowiedzi whoami. Ponieważ findFirst()zwraca an Optional, dobrą praktyką jest sprawdzenie, czy istnieje wartość.

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

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

 var key = optional.get();

Niektórzy zauważyli również, że znalezienie pierwszego klucza a HashSetjest zawodne. Ale czasami mamy HashMappary; czyli na każdej mapie mamy jeden klucz i jedną wartość. W takich przypadkach wygodne jest szybkie znalezienie pierwszego klucza z takiej pary.


0

To także fajny sposób na zrobienie tego :)

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

-2

Możesz też spróbować poniżej:

Map.Entry<String, Integer> entry = myMap.firstEntry();
System.out.println("First Value = " + entry);

1
Nie ma takiej metody
Adrian Grygutis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.