Saat ini saya menggunakan HashMap<String, Integer>
yang diisi dengan kunci bertipe String
yang semuanya, katakanlah, panjangnya 5 karakter. Bagaimana saya bisa mencari kunci tertentu yang terdiri dari 4 karakter atau kurang, yang merupakan bagian dan di awal beberapa kunci lainnya dan mendapatkan semua hit sebagai kumpulan <Key, Value>
?
HashMap‹String, Integer› Cari bagian dari kunci? [duplikat]
Jawaban (8)
Iterasi adalah satu-satunya pilihan Anda kecuali Anda membuat struktur data khusus:
for (Entry<String, Integer> e : map.entrySet()) {
if (e.getKey().startsWith("xxxx")) {
//add to my result list
}
}
Jika Anda memerlukan sesuatu yang lebih efisien waktu maka Anda memerlukan implementasi peta tempat Anda melacak kunci parsial ini.
Sepertinya kasus penggunaan untuk TreeMap
daripada HashMap
. Perbedaannya adalah TreeMap menjaga ketertiban. Jadi Anda dapat menemukan kecocokan parsial Anda lebih cepat. Anda tidak harus menelusuri keseluruhan peta.
Periksa pertanyaan ini Penelusuran sebagian di HashMap
Anda tidak dapat melakukan ini melalui HashMap
, Anda harus menulis implementasi Anda sendiri untuk Map
untuk mengimplementasikan pencarian berdasarkan panjang string di peta.
Map
dapat berupa ekstensi (extends
) dari HashMap
atau implementasi lain yang sudah ada, timpa hanya yang diperlukan. Maksud saya adalah untuk pertanyaan ini Map
tampaknya merupakan struktur data yang benar tetapi dengan beberapa get
yang dimodifikasi (untuk pengambilan berdasarkan panjang) dan dimasukkan (untuk mendapatkan optimal, ucapkan O(1)
lagi). Karena semua jawaban lain menunjukkan logika eksternal sebagai solusi, memiliki Map
spesifik akan menerapkan enkapsulasi logika itu di dalam peta itu sendiri.
- person harsh; 21.05.2013
Map<String, Integer> result = new HashMap<String, Integer>;
for(String key : yourMap.keySet()) {
if(key.length() == 4){
result.put(key, yourMap.get(key);
}
}
Setelah menjalankan kode ini Anda memiliki semua pasangan kunci/nilai dengan kunci 4 huruf di result
.
Set<Entry<String, Integer>> s1 = map.entrySet();
for (Entry<String, Integer> entry : s1) {
if(entry.getKey().length == 4)
//add it to a map;
}
Pertama, setel entri ke peta hash Anda. Ulangi set dan periksa panjang setiap kunci dan tambahkan ke peta atau gunakan sesuai keinginan Anda.
Dengan HashMap<String, Integer>
Anda hanya dapat melewati keySet()
dan melakukan contains()
untuk String
kunci dan pola Anda.
Seperti yang telah disebutkan, tidak ada cara yang sangat efisien* untuk melakukannya dengan struktur data yang telah Anda tentukan. Namun, jika Anda menambahkan Map<Integer, List<String>>
tambahan untuk melacak pemetaan dari panjang string ke daftar semua kunci dengan panjang tersebut, maka Anda akan dapat melakukannya dengan sangat efisien.
*Hanya dengan menggunakan Map‹String, Integer›, Anda perlu melakukan iterasi melalui seluruh kapasitas peta yang lebih besar, sedangkan menambahkan struktur data tambahan ini akan menerapkan pencarian O(1) (dengan asumsi Anda menggunakan HashMap) diikuti dengan iterasi hanya melalui kumpulan hasil, yang merupakan hasil tercepat yang mungkin.
Anda dapat mencoba pendekatan ini:
public Map<String,Integer> filterMap(Map<String, Integer> inputMap){
Map<String, Integer> resultHashMap = new HashMap<String, Integer>();
for (String key : inputMap.keySet()) {
if(key.length()==5){
resultHashMap.put(key,inputMap.get(key));
}
}
return resultHashMap;
}
getKey.length()
dan menambahkan atau tidak (tergantung kondisi) keList<>
- person Javier Diaz   schedule 21.05.2013keySet()
? - person vikingsteve   schedule 21.05.2013Trie
. - person Thomas Jungblut   schedule 21.05.2013