Saya mencari kelas di java yang memiliki asosiasi nilai kunci, tetapi tanpa menggunakan hash. Inilah yang sedang saya lakukan:
- Tambahkan nilai ke a
Hashtable
. - Dapatkan iterator untuk
Hashtable.entrySet()
. - Ulangi semua nilai dan:
- Dapatkan
Map.Entry
untuk iterator. - Buat objek tipe
Module
(kelas kustom) berdasarkan nilai. - Tambahkan kelas ke JPanel.
- Dapatkan
- Tampilkan panel.
Masalah dengan ini adalah bahwa saya tidak memiliki kontrol atas urutan yang saya dapatkan kembali nilai-nilai, jadi saya tidak dapat menampilkan nilai-nilai dalam urutan yang diberikan (tanpa hard-coding urutan).
Saya akan menggunakan ArrayList
atau Vector
untuk ini, tetapi nanti dalam kode saya perlu mengambil Module
objek untuk Kunci yang diberikan, yang saya tidak bisa lakukan dengan ArrayList
atau Vector
.
Apakah ada yang tahu tentang kelas Java sumber bebas / terbuka yang akan melakukan ini, atau cara untuk mendapatkan nilai Hashtable
berdasarkan ketika mereka ditambahkan?
Terima kasih!
java
dictionary
key-value
Shane
sumber
sumber
Jawaban:
Saya sarankan a
LinkedHashMap
atau aTreeMap
. ALinkedHashMap
menyimpan kunci dalam urutan yang dimasukkan, sementaraTreeMap
disimpan diurutkan melaluiComparator
atau urutan alamiComparable
elemen.Karena tidak harus menjaga elemen diurutkan,
LinkedHashMap
harus lebih cepat untuk sebagian besar kasus;TreeMap
memilikiO(log n)
kinerja untukcontainsKey
,get
,put
, danremove
, menurut Javadocs, sedangkanLinkedHashMap
adalahO(1)
untuk setiap.Jika API Anda yang hanya mengharapkan urutan pengurutan yang dapat diprediksi, sebagai lawan dari urutan pengurutan tertentu, pertimbangkan untuk menggunakan antarmuka yang diterapkan oleh dua kelas ini,
NavigableMap
atauSortedMap
. Ini akan memungkinkan Anda untuk tidak membocorkan implementasi spesifik ke dalam API Anda dan beralih ke salah satu dari kelas spesifik tersebut atau implementasi yang sama sekali berbeda setelahnya.sumber
LinkedHashMap akan mengembalikan elemen dalam urutan mereka dimasukkan ke dalam peta ketika Anda mengulangi keySet (), entrySet () atau nilai () peta.
Ini akan mencetak elemen sesuai urutan mereka dimasukkan ke dalam peta:
sumber
Jika peta yang tidak berubah sesuai dengan kebutuhan Anda, maka ada perpustakaan oleh google bernama jambu (lihat juga pertanyaan jambu )
Guava menyediakan ImmutableMap dengan pesanan iterasi yang ditentukan pengguna yang andal. ImmutableMap ini memiliki kinerja O (1) untuk containKey, dapatkan. Jelas menempatkan dan menghapus tidak didukung.
Objek ImmutableMap dibuat dengan menggunakan metode kenyamanan statis statis () dan copyOf () atau objek Builder .
sumber
Anda dapat mempertahankan
Map
(untuk pencarian cepat) danList
(untuk pesanan) tetapiLinkedHashMap
mungkin yang paling sederhana. Anda juga dapat mencobaSortedMap
misalnyaTreeMap
, yang memiliki pesanan apa pun yang Anda tentukan.sumber
Saya tidak tahu apakah itu opensource, tetapi setelah sedikit googling, saya menemukan implementasi Peta ini menggunakan ArrayList . Sepertinya Java pra-1.5, jadi Anda mungkin ingin membuatnya generik, yang seharusnya mudah. Perhatikan bahwa implementasi ini memiliki akses O (N), tetapi ini seharusnya tidak menjadi masalah jika Anda tidak menambahkan ratusan widget ke JPanel Anda, yang toh tidak seharusnya Anda lakukan.
sumber
Anda dapat mencoba implementasi Tree Linked Map saya .
sumber
Setiap kali saya perlu mempertahankan urutan alami dari hal-hal yang diketahui sebelumnya, saya menggunakan EnumMap
kunci akan enum dan Anda dapat memasukkan dalam urutan apa pun yang Anda inginkan tetapi ketika Anda mengulanginya akan beralih dalam urutan enum (urutan alami).
Juga ketika menggunakan EnumMap seharusnya tidak ada tabrakan yang bisa lebih efisien.
Saya benar-benar menemukan bahwa menggunakan enumMap membuat kode yang mudah dibaca bersih. Berikut ini sebuah contoh
sumber
Anda dapat menggunakan LinkedHashMap untuk urutan penyisipan utama di Peta
Poin penting tentang kelas Java LinkedHashMap adalah:
LinkedHashMap berisi nilai berdasarkan kunci 3. Mungkin memiliki satu kunci nol dan beberapa nilai nol. 4. Ini sama dengan HashMap sebagai gantinya mempertahankan urutan penyisipan
Tetapi jika Anda ingin mengurutkan nilai di peta menggunakan objek yang ditentukan Pengguna atau kunci tipe data primitif apa pun maka Anda harus menggunakan TreeMap Untuk informasi lebih lanjut, lihat tautan ini
sumber
Baik Anda dapat menggunakan
LinkedHashMap<K, V>
atau Anda dapat menerapkan CustomMap Anda sendiri yang mempertahankan urutan penyisipan.Anda dapat menggunakan Berikut
CustomHashMap
dengan fitur-fitur berikut:null
atau string kosong tidak diizinkan.HashMap
vsLinkedHashMap
vsCustomHashMap
Penggunaan
CustomHashMap
:O / P:
Jika Anda tahu Kuncinya sudah diperbaiki maka Anda dapat menggunakan EnumMap. Dapatkan nilai dari Properties / file XML
EX:
sumber