HashMap - İlk Anahtar değerini alma


129

HashMap'te bulunan değerler aşağıdadır

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

İlk Anahtarı almak için Java kodu (yani Aktif)

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

İlk Anahtar "Değer" i (yani 33) nasıl toplayabiliriz, hem "Anahtar" ı hem de "Değer" i ayrı bir değişkende saklamak istiyorum.


9
HashMapGirişlerin sırasız olduğunu ve bu nedenle haritayı her değiştirdiğinizde "ilk" in değişebileceğinin farkında mısınız?
NPE

1
A'da belirli bir düzen olmadığını anlıyor musunuz HashMap? Hiç değiştirirseniz, sonuçları tamamen farklı bir sırada alabilirsiniz.
Jon Skeet

Hayır, sipariş çalıştırmadan çalışmaya garanti edilmez, ancak aynı iş parçacığı içinde sıraya güvenilebilir.
hd1

1
@JonSkeet Aslında bu gerçekten geçerli bir soru. Groovy'de, her haritanın tek bir girişe sahip olduğu bir harita listesi gibi görünen bir yapıyı geri aldığınız birçok durum vardır. Şimdiye kadar tüm değerleri yazdırmanın kolay / açık (Harika) bir yolunu bulamadım. Anahtarlar sabitse, her bir değeri yazdırmak collection.each {println it.key} kadar kolaydır, ancak sabit anahtarlar olmadan açık değildir, ancak collection.each {println it.values ​​() [0]} çalışır ( Buradaki bazı cevapların iyileştirilmesi ...).
Bill K

@BillK: Her haritanın tam olarak bir girişi olduğunu biliyorsanız, bu gerçekten farklı bir soru ve daha mantıklı.
Jon Skeet

Yanıtlar:


251

Bunu deneyebilirsiniz:

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

Unutmayın HashMap, kampanya siparişini garanti etmez. KullanınLinkedHashMapSiparişin bozulmaması için .

Örneğin:

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

Çıktı:

 Active
 33

Bunun çok eski bir cevap olduğunu biliyorum .. bu anahtar ve değer dizgeleri olan hashmap'ler için çalışıyor. ama aynı şeyi nesne ile denerken, dönüşüm hatası alan bir değer için: com.google.gson.internal.LinkedTreeMap cannot be cast to...... Stringdoğru yerde yerine belirttiğim sınıfım ... çevrimiçi cevap bulamıyorum..help
Blue Bot

@darthydarth, içeriğinize göre uygun türü kullanmalısınız.
Ruchira Gayan Ranaweera

cevapladığınız için ilk süper teşekkürler! bunu beklemiyordum ... ikinci olarak, çalışma zamanında kaydedilmeyen Generics ile ilgili bir sorun olduğunu buldum. sonunda Gsondeğer nesnesini Stringa'ya dönüştürmek ve ardından sınıf tipime geri dönüştürmek için kullanarak onu hackledim . Çirkin ama diğer dillerde yapılması bu kadar kolay olan bir şeye gerçekten başka bir çözüm bulamadım (şimdi Java öğreniyorum)
Blue Bot

elbette ama nasıl? yorumlar bölümü için çok fazla
Blue Bot

@darthydarth bana bir e-posta gönderebilirsiniz. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

66

"İlk" değeri almak için:

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

"İlk" anahtarın değerini almak için:

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

Not: Yukarıdaki kod test edildi ve çalışıyor.

HashMap girdileri sıralı olmadığı için "ilk" diyorum.

Bununla birlikte, bir LinkedHashMap, girişlerini eklendikleri sırayla yineler - ekleme sırası önemliyse bunu harita uygulamanız için kullanabilirsiniz.


öncelikle haritanın boş olmadığını kontrol etmeniz gerekiyor
ACV

48

Java 8 yolu,

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


eğer anahtara sahipsek, map.get (firstKey) kullanarak ilk değeri alın. Sadece bir ipucu. :)
2019

7

Bunu ilk girişin tamamını almak için de deneyebilirsiniz,

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

Bu, yalnızca ilk girişin anahtarını almak içindir,

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

Bu, yalnızca ilk girişin değerini almak için,

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

Ayrıca, ne yaptığınızı biliyorsanız ve bir haritanın ikinci (üçüncü vb. İçin aynı) öğesini almak istiyorsanız, bunu denemelisiniz,

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

ilk Anahtar "Değer" i nasıl toplayabiliriz (yani 33)

Kullanarak youMap.get(keyYouHave)değerini elde edebilirsiniz.

Hem "Anahtar" hem de "Değer" i ayrı bir değişkende depolamak istiyorsanız

Evet, bunu bir değişkene atayabilirsiniz.

Bekle ......... bitmedi.

Siz (iş mantığı) ekleme ve alma sırasına bağlıysanız, garip sonuçlar göreceksiniz. Harita sıralı değil, sırayla saklamayacaklar. Lütfen bunun farkında olun. Siparişinizi korumak için bazı alternatifler kullanın. Muhtemelen aLinkedHashMap


2

Unutmayın ki, mantık akışınızın HashMapöğelere herhangi bir sırayla erişmeye asla dayanmaması gerektiğini unutmayın , basitçe ifade etmek gerekirse, HashMaps sıralı Collections değildir ve amaçlandıkları şey bu değildir. ( Bu yazıda odered ve sıralayıcı koleksiyonları hakkında daha fazla bilgi edinebilirsiniz ).

Gönderiye geri dönersek, ilk element anahtarını yükleyerek işin yarısını zaten yaptınız:

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

Sadece map.get(key)ilgili değeri almak için arayın :

Object myValue = statusName.get(myKey);

1

Genel anlamda bir haritada ekleme sırasına uyulmadığını unutmayın. Bunu dene :

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

Bunu sadece bundan emin olduğumda kullanırım map.size() == 1.


1

Whoami'nin cevabını geliştirmek. Yana findFirst()bir getiri Optional, bir değer olup olmadığını kontrol etmek için iyi bir uygulamadır.

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

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

 var key = optional.get();

Ayrıca, bazıları a'nın ilk anahtarını bulmanın HashSetgüvenilmez olduğu yorumunu yaptı. Ama bazen HashMapçiftlerimiz olur; yani her haritada bir anahtar ve bir değerimiz var. Bu gibi durumlarda, böyle bir çiftin ilk anahtarını hızlı bir şekilde bulmak uygundur.


0

Ayrıca bunu yapmanın güzel bir yolu :)

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

-2

Aşağıdakileri de deneyebilirsiniz:

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

1
Böyle bir yöntem yok
Adrian Grygutis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.