HashMap‹String, Integer› Cari bagian dari kunci? [duplikat]

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>?


person VoidStar    schedule 21.05.2013    source sumber
comment
Anda harus mengulangi semua HashMap, menggunakan getKey.length() dan menambahkan atau tidak (tergantung kondisi) ke List<>   -  person Javier Diaz    schedule 21.05.2013
comment
Pernahkah Anda melihat keySet() ?   -  person vikingsteve    schedule 21.05.2013
comment
Apakah terlalu sulit untuk diselesaikan, jika ya bagi Anda, setidaknya bagikan apa yang telah Anda coba sejauh ini?   -  person Juned Ahsan    schedule 21.05.2013
comment
Apa yang Anda cari disebut Trie.   -  person Thomas Jungblut    schedule 21.05.2013
comment
Pertanyaan: dia mencari entri yang memiliki 4 karakter, bukan 5 karakter? Atau dia mencari rangkaian 4 karakter yang mungkin berada dalam 5 karakter?   -  person Menelaos    schedule 21.05.2013
comment
Saya mengedit pertanyaan saya. Seharusnya sudah jelas sekarang   -  person VoidStar    schedule 21.05.2013
comment
@Machtl Apakah 4 karakter di awal atau akhir string)? Bisakah mereka berada di mana saja dalam string?   -  person Menelaos    schedule 21.05.2013


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.

person cyborg    schedule 21.05.2013

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

person Ondrej Bozek    schedule 21.05.2013

Anda tidak dapat melakukan ini melalui HashMap, Anda harus menulis implementasi Anda sendiri untuk Map untuk mengimplementasikan pencarian berdasarkan panjang string di peta.

person harsh    schedule 21.05.2013
comment
Kecuali tentu saja, dia mengubah persyaratan, menggunakan kunci dengan hanya 4 karakter, dan menyimpan data lain dalam suatu objek yang bernilai. Pilihan lainnya adalah menggunakan Objek Kunci khusus, dengan metode hashCode() khusus. - person Menelaos; 21.05.2013
comment
Saya tidak menyarankan untuk menggulirkan Peta sendiri‹›. Itu mungkin berlebihan (dan, selain itu, komposisi seringkali lebih baik daripada warisan). Namun, saya setuju bahwa struktur data sebagaimana adanya tidak dirancang untuk melakukan hal ini. - person Michael Aaron Safyan; 21.05.2013
comment
Anda tidak perlu mengimplementasikan semua Map. Menambahkan barang tambahan cukup mudah jika Anda menggunakan pola dekorator. Jadi misalnya saya ingin keluar dari setiap kunci yang ditambahkan ke peta? Baiklah, saya membuat LoggingMap saya mengimplementasikan Peta dan kemudian Anda harus menyediakan contoh sebenarnya dari Peta yang akan dikeluarkannya. Itu akan bekerja dengan baik dalam kasus ini kecuali alih-alih mencatat, Anda akan melacak kunci yang Anda inginkan dalam daftar atau sesuatu seperti itu. - person cyborg; 21.05.2013
comment
Ya benar implementasi 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.

person André Stannek    schedule 21.05.2013

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.

person Adarsh    schedule 21.05.2013

Dengan HashMap<String, Integer> Anda hanya dapat melewati keySet() dan melakukan contains() untuk String kunci dan pola Anda.

person pbespechnyi    schedule 21.05.2013

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.

person Michael Aaron Safyan    schedule 21.05.2013

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;
    }
person Shreyos Adikari    schedule 21.05.2013