Apakah ada cara yang elegan untuk mendapatkan hanya satu Entry<K,V>
dari HashMap, tanpa iterasi, jika kuncinya tidak diketahui.
Karena urutan entri tidak penting, bisakah kita mengatakan sesuatu seperti
hashMapObject.get(zeroth_index);
Meskipun saya sadar bahwa tidak ada metode indeks get get.
Jika saya mencoba pendekatan yang disebutkan di bawah, itu masih harus mendapatkan semua set entri hashmap .
for(Map.Entry<String, String> entry : MapObj.entrySet()) {
return entry;
}
Saran diterima.
EDIT: Tolong sarankan Struktur Data lain untuk mencukupi persyaratan.
java
collections
nilesh
sumber
sumber
firstEntry()
metode tidak didefinisikan dalam antarmukaSortedMap
tetapi hanya dalamTreeMap
danConcurrentSkipListMap
:(SortedMap
karena punyafirstKey()
metode.Peta tidak diurutkan, jadi tidak ada yang namanya 'entri pertama', dan itu juga sebabnya tidak ada metode get-by-index pada
Map
(atauHashMap
).Anda bisa melakukan ini:
(Catatan: Memeriksa peta kosong dihilangkan).
Kode Anda tidak mendapatkan semua entri di peta, ia segera kembali (dan keluar dari loop) dengan entri pertama yang ditemukan.
Untuk mencetak kunci dan nilai elemen pertama ini:
Catatan: Memanggil
iterator()
tidak berarti Anda mengulangi seluruh peta.sumber
LinkedHashMap
simpan kunci sesuai urutan yang dimasukkan.Map
implementasi sepertiLinkedHashMap
danTreeMap
memang memiliki urutan yang ditentukan. (HashMap
tidak).Saya kira iterator mungkin solusi paling sederhana.
Solusi lain (tidak cantik):
Atau (tidak lebih baik):
sumber
Dapatkan nilai, konversi ke array, dapatkan elemen pertama array:
W.
sumber
Mengapa Anda ingin menghindari memanggil
entrySet()
itu tidak umum membuat obyek yang sama sekali baru dengan konteks sendiri, tapi malah memberikan objek fasad. Cukup berbicaraentrySet()
adalah operasi yang cukup murah.sumber
Jika Anda menggunakan Java 8, sesederhana findFirst () :
Contoh cepat:
sumber
Jika Anda benar-benar menginginkan API yang Anda sarankan, Anda dapat mensubkontrakkan HashMap dan melacak kunci dalam Daftar misalnya. Tidak benar-benar mengerti maksudnya, tetapi ini memberi Anda apa yang Anda inginkan. Jika Anda menjelaskan kasus penggunaan yang dimaksud, mungkin kita dapat menemukan solusi yang lebih baik.
EDIT: Saya sengaja tidak mempelajari sisi generik dari ini ...
sumber
Apa yang Anda maksud dengan "tanpa iterasi"?
Anda dapat menggunakan
map.entrySet().iterator().next()
dan Anda tidak akan beralih melalui peta (dalam arti "menyentuh setiap objek"). Anda tidak bisa mendapatkanEntry<K, V>
tanpa menggunakan iterator. Javadoc of Map.Entry mengatakan:Bisakah Anda menjelaskan lebih detail, apa yang ingin Anda capai? Jika Anda ingin menangani objek terlebih dahulu, yang cocok dengan kriteria tertentu (seperti "memiliki kunci tertentu") dan kembali ke objek yang tersisa, kemudian lihat pada PriorityQueue . Ini akan memesan objek Anda berdasarkan pesanan alami atau yang ditentukan khusus
Comparator
yang Anda berikan.sumber
Pendekatan ini tidak berhasil karena Anda menggunakan HashMap. Saya berasumsi menggunakan LinkedHashMap akan menjadi solusi yang tepat dalam kasus ini.
sumber
Ini akan mendapatkan satu entri dari peta, yang sedekat mungkin, mengingat 'pertama' tidak benar-benar berlaku.
sumber
Tersandung di sini mencari hal yang sama ... Saya kemudian ingat
Iterables
kelas dari perpustakaan Jambu .Untuk mendapatkan "pertama" elemen:
Iterables.getFirst( someMap.values(), null );
.Pada dasarnya melakukan hal yang sama
Map.values().iterator().next()
, tetapi juga memungkinkan Anda untuk menentukan default (dalam hal ini nol) jika tidak ada apa pun di Peta.Iterables.getLast( someMap.values(), null );
mengembalikan elemen terakhir di Peta.Iterables.get( someMap.values(), 7, null );
mengembalikan elemen ke-7 di Peta jika ada, jika tidak nilai default (dalam hal ini nol).Ingat juga bahwa HashMaps tidak dipesan ... jadi jangan berharap
Iterables.getFirst
untuk mengembalikan item pertama yang Anda lemparkan ke sana ... jugaIterables.getLast
. Mungkin berguna untuk mendapatkan sebuah nilai dipetakan sekalipun.Mungkin tidak layak menambahkan perpustakaan Guava hanya untuk itu, tetapi jika Anda kebetulan menggunakan beberapa utilitas keren lainnya di dalam perpustakaan itu ...
sumber
Mengikuti EDIT Anda, inilah saran saya:
Jika Anda hanya memiliki satu entri, Anda dapat mengganti Peta dengan objek ganda. Tergantung pada jenisnya, dan preferensi Anda:
sumber
sumber
Saya mendapat jawabannya: (Sederhana saja)
Ambil ArrayList, lalu masukkan dan temukan ukuran daftar array. Ini dia :
Ini akan menunjukkan ukurannya. (Berikan saran). Bekerja.
sumber