Apakah mungkin untuk HashMap
mengembalikan nilai default untuk semua kunci yang tidak ditemukan di set?
java
dictionary
hashmap
Larry
sumber
sumber
getOrDefault()
tautanJawaban:
[Memperbarui]
Seperti dicatat oleh jawaban dan komentator lain, pada Java 8 Anda cukup menelepon
Map#getOrDefault(...)
.[Asli]
Tidak ada implementasi Peta yang melakukan hal ini dengan tepat tetapi akan sepele untuk mengimplementasikannya sendiri dengan memperluas HashMap:
sumber
(v == null)
ke(v == null && !this.containsKey(k))
dalam kasus mereka sengaja menambahkannull
nilai. Saya tahu, ini hanya kasus sudut, tetapi penulis mungkin mengalami itu.!this.containsValue(null)
. Ini agak berbeda dari!this.containsKey(k)
. ThecontainsValue
solusi akan gagal jika beberapa lainnya kunci telah secara eksplisit diberi nilainull
. Misalnya:map = new HashMap(); map.put(k1, null); V v = map.get(k2);
Dalam hal ini,v
apakah masih akannull
, benar?Di Java 8, gunakan Map.getOrDefault . Dibutuhkan kunci, dan nilai untuk kembali jika tidak ada kunci yang cocok ditemukan.
sumber
getOrDefault
sangat bagus, tetapi membutuhkan definisi default setiap kali peta diakses. Menentukan nilai default sekali juga akan memiliki manfaat keterbacaan saat membuat peta nilai statis.private static String get(Map map, String s) { return map.getOrDefault(s, "Error"); }
Gunakan Commed ' DefaultedMap jika Anda merasa tidak ingin menciptakan kembali roda, misalnya,
Anda juga dapat meneruskan di peta yang ada jika Anda tidak bertanggung jawab untuk membuat peta di tempat pertama.
sumber
Java 8 memperkenalkan metode standar computeIfAbsent yang bagus untuk
Map
antarmuka yang menyimpan nilai yang dikomputasi dengan malas sehingga tidak merusak kontrak peta:Asal: http://blog.javabien.net/2014/02/20/loadingcache-in-java-8-without-guava/
Disclamer: Jawaban ini tidak cocok dengan apa yang ditanyakan OP tetapi mungkin berguna dalam beberapa kasus mencocokkan judul pertanyaan ketika nomor kunci terbatas dan caching nilai yang berbeda akan menguntungkan. Seharusnya tidak digunakan dalam kasus yang berlawanan dengan banyak kunci dan nilai default yang sama karena ini akan membuang-buang memori.
sumber
Tidak bisakah Anda membuat metode statis yang melakukan ini?
sumber
Anda cukup membuat kelas baru yang mewarisi HashMap dan menambahkan metode getDefault. Berikut ini contoh kode:
Saya pikir Anda tidak boleh mengesampingkan metode get (K key) dalam implementasi Anda, karena alasan yang ditentukan oleh Ed Staub dalam komentarnya dan karena Anda akan memutus kontrak antarmuka Peta (ini berpotensi menyebabkan beberapa sulit ditemukan) bug).
sumber
get
metode. Di sisi lain - solusi Anda tidak memungkinkan menggunakan kelas melalui antarmuka, yang mungkin sering terjadi.Menggunakan:
sumber
Ini dilakukan secara default. Ia kembali
null
.sumber
HashMap
hanya untuk fungsi ini ketikanull
baik-baik saja.NullObject
pola, atau tidak ingin menyebarkan cek-nol di seluruh kode Anda - keinginan yang sepenuhnya saya mengerti.Di java 8+
sumber
Saya menemukan LazyMap cukup membantu.
Ini memungkinkan Anda melakukan sesuatu seperti ini:
Panggilan untuk
get
menciptakan nilai default untuk kunci yang diberikan. Anda menentukan cara membuat nilai default dengan argumen pabrik untukLazyMap.lazyMap(map, factory)
. Pada contoh di atas, peta diinisialisasi ke yang baruAtomicInteger
dengan nilai 0.sumber
List<String>
- menggunakan jawaban yang diterima saya akan mengambil risiko menggunakan daftar yang sama untuk setiap kunci baru, daripada (katakanlah)new ArrayList<String>()
dari pabrik.Tidak secara langsung, tetapi Anda dapat memperluas kelas untuk memodifikasi metode get-nya. Berikut ini adalah contoh siap pakai: http://www.java2s.com/Code/Java/Collections-Data-Structure/ExtendedVersionofjavautilHashMapthatprovidesanextendedgetmethodaccpetingadefaultvalue.htm
sumber
Contoh penggunaan:
sumber
Saya perlu membaca hasil yang dikembalikan dari server di JSON di mana saya tidak bisa menjamin bidang akan ada. Saya menggunakan kelas org.json.simple.JSONObject yang berasal dari HashMap. Berikut adalah beberapa fungsi pembantu yang saya gunakan:
sumber
Dalam proyek Jawa / Kotlin campuran juga mempertimbangkan Map.withDefault Kotlin .
sumber