HashMap - mendapatkan nilai Kunci Pertama


129

Di bawah ini adalah nilai-nilai yang terkandung di dalam HashMap

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

Kode Java untuk mendapatkan Kunci pertama (yaitu Aktif)

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

Bagaimana kita bisa mengumpulkan "Nilai" Kunci pertama (yaitu 33), saya ingin menyimpan "Kunci" dan "Nilai" dalam variabel terpisah.


9
Anda menyadari bahwa HashMapentri tidak berurutan, sehingga "pertama" dapat berubah setiap kali Anda memodifikasi peta?
NPE

1
Apakah Anda memahami bahwa tidak ada urutan khusus dalam a HashMap? Jika Anda memodifikasinya sama sekali, Anda mungkin mendapatkan hasil dalam urutan yang sama sekali berbeda.
Jon Skeet

Tidak, pesanan tidak dijamin untuk dijalankan, tetapi dalam utas yang sama, pesanan dapat diandalkan.
hd1

1
@JonSkeet Sebenarnya ini adalah pertanyaan yang sangat valid. Di Groovy ada banyak kasus di mana Anda mendapatkan kembali struktur yang terlihat seperti daftar peta, setiap peta dengan satu entri. Sejauh ini saya belum menemukan cara (Groovy) yang mudah / jelas untuk mencetak semua nilai. Jika kuncinya konstan, semudah collection.each {println it.key} untuk mencetak setiap nilai, tetapi tanpa kunci konstan itu tidak jelas, tetapi collection.each {println it.values ​​() [0]} berfungsi ( Penyempurnaan dari beberapa jawaban di sini ...).
Bill K

@BillK: Jika Anda tahu setiap peta memiliki tepat satu entri, maka itu pertanyaan yang sebenarnya berbeda, dan yang lebih masuk akal.
Jon Skeet

Jawaban:


251

Anda dapat mencoba ini:

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

Perlu diingat, HashMaptidak menjamin urutan penyisipan. Gunakan a LinkedHashMapuntuk menjaga agar pesanan tetap utuh.

Misalnya:

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

Keluaran:

 Active
 33

Saya tahu ini adalah jawaban yang sangat lama .. ini berfungsi untuk hashmaps dengan kunci dan nilai sebagai string. tetapi ketika mencoba hal yang sama dengan objek untuk nilai yang mendapatkan kesalahan pengecoran: com.google.gson.internal.LinkedTreeMap cannot be cast to...... kelas saya yang saya nyatakan alih-alih Stringdi tempat yang benar ... tidak dapat menemukan jawaban online .. bantuan
Bot Biru

@darthydarth Anda harus menggunakan jenis yang tepat berdasarkan konteks Anda.
Ruchira Gayan Ranaweera

terima kasih super pertama telah menjawab! tidak mengharapkannya ... kedua saya, menemukan bahwa ada masalah dengan Generik tidak disimpan dalam runtime. akhirnya saya meretasnya dengan menggunakan Gsonto convert value object menjadi a Stringdan kemudian menguraikannya kembali ke tipe kelas saya. Ini jelek tetapi saya benar-benar tidak dapat menemukan solusi lain untuk sesuatu yang sangat mudah dilakukan dalam bahasa lain (saya belajar Java sekarang)
Blue Bot

yakin tapi bagaimana caranya? itu terlalu banyak untuk bagian komentar
Blue Bot

@darthydarth Anda dapat mengirimi saya email. ruchiragayan@gmail.com
Ruchira Gayan Ranaweera

65

Untuk mendapatkan nilai "pertama":

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

Untuk mendapatkan nilai kunci "pertama":

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

Catatan: Kode di atas diuji dan berfungsi.

Saya mengatakan "pertama" karena entri HashMap tidak dipesan.

Namun, LinkedHashMap mengulang entri dalam urutan yang sama seperti saat dimasukkan - Anda dapat menggunakannya untuk implementasi peta Anda jika urutan penyisipan penting.


Anda harus terlebih dahulu memeriksa bahwa peta tidak kosong
ACV

48

Cara melakukan Java 8,

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


jika kita memiliki kuncinya, ambil nilai pertama menggunakan map.get (firstKey). Hanya sebuah petunjuk. :)
Upen

7

Anda juga dapat mencoba ini untuk mendapatkan seluruh entri pertama,

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

Ini untuk mendapatkan hanya kunci entri pertama,

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

Ini untuk mendapatkan hanya nilai entri pertama,

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

Selain itu, jika Anda tahu apa yang Anda lakukan dan Anda ingin mendapatkan item kedua (sama untuk ketiga dll) dari sebuah peta, Anda harus mencoba ini,

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

bagaimana kita bisa mengumpulkan "Nilai" Kunci pertama (yaitu 33)

Dengan menggunakan youMap.get(keyYouHave), Anda bisa mendapatkan nilainya.

ingin menyimpan "Kunci" dan "Nilai" dalam variabel terpisah

Ya, Anda dapat menetapkannya ke variabel.

Tunggu ......... ini belum berakhir.

Jika Anda (logika bisnis) bergantung pada urutan penyisipan dan pengambilan, Anda akan melihat hasil yang aneh. Peta tidak dipesan, mereka tidak akan menyimpan dalam urutan. Harap perhatikan fakta itu. Gunakan beberapa alternatif untuk mempertahankan pesanan Anda. Mungkin aLinkedHashMap


2

Perhatikan bahwa Anda harus mencatat bahwa aliran logika Anda tidak boleh bergantung pada pengaksesan HashMapelemen dalam beberapa urutan, sederhananya karena HashMaps tidak diurutkan Collectiondan bukan itu yang dimaksudkan untuk dilakukan. (Anda dapat membaca lebih lanjut tentang koleksi odered dan sorter di posting ini ).

Kembali ke posting, Anda sudah melakukan setengah pekerjaan dengan memuat kunci elemen pertama:

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

Panggil saja map.get(key)untuk mendapatkan nilainya masing-masing:

Object myValue = statusName.get(myKey);

1

Ingatlah bahwa urutan penyisipan tidak dipatuhi di peta secara umum. Coba ini :

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

Saya menggunakan ini hanya jika saya yakin akan hal itu map.size() == 1.


1

Meningkatkan jawaban whoami. Sejak findFirst()mengembalikan sebuah Optional, adalah praktik yang baik untuk memeriksa apakah ada nilai.

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

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

 var key = optional.get();

Juga, beberapa berkomentar bahwa menemukan kunci pertama dari a HashSettidak dapat diandalkan. Tapi terkadang kami memiliki HashMappasangan; yaitu di setiap peta kami memiliki satu kunci dan satu nilai. Dalam kasus seperti itu, menemukan kunci pertama dari pasangan semacam itu dengan cepat sangatlah mudah.


0

Juga cara yang bagus untuk melakukan ini :)

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

-2

Anda juga dapat mencoba di bawah ini:

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

1
Tidak ada metode seperti itu
Adrian Grygutis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.