Apa yang Anda maksud dengan "posisi"? HashMaps tidak diurutkan, jadi mereka tidak memiliki gagasan biasa tentang "posisi" yang akan Anda dapatkan dengan sesuatu seperti Vektor.
Mat
1
Apakah yang Anda maksud dengan urutan penyisipannya atau pemesanan lainnya?
Ini tidak benar-benar menjawab pertanyaan itu. Jawaban lain di bawah ini lebih bermanfaat.
forresthopkinsa
6
Sehubungan dengan itu, ini mengutip dokumentasi yang secara langsung menjawab pertanyaan
Wayne
1
Bahkan jika urutannya tidak konstan dari waktu ke waktu, masih mungkin untuk mengambil salah satu anggota dengan posisi tertentu.
Pemula
Saya tidak mengikuti. Menjelaskan?
Wayne
Tautan HashMap rusak / 404.
Raf
109
Gunakan LinkedHashMap dan ketika Anda perlu mengambil berdasarkan posisi, ubah nilainya menjadi ArrayList.
LinkedHashMap<String,String> linkedHashMap =newLinkedHashMap<String,String>();/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");/* Get by position */int pos =1;String value =(newArrayList<String>(linkedHashMap.values())).get(pos);
Paling sederhana saya harus mengatakan ... Alih-alih mengubah setiap hal, Anda hanya menggunakan keyset. Luar biasa
kirtan403
19
Jika Anda, karena alasan tertentu, harus tetap menggunakan hashMap, Anda dapat mengonversi keySet ke array dan mengindeks kunci dalam array untuk mendapatkan nilai di peta seperti ini:
Tabel hash dan implementasi daftar tertaut dari antarmuka Peta, dengan urutan iterasi yang dapat diprediksi. Implementasi ini berbeda dari HashMap karena mempertahankan daftar tertaut ganda yang berjalan melalui semua entri.
Saya berasumsi dengan 'posisi' Anda mengacu pada urutan di mana Anda telah memasukkan elemen ke dalam HashMap. Dalam hal ini Anda ingin menggunakan LinkedHashMap. Namun LinkedHashMap tidak menawarkan metode pengakses; Anda perlu menulis satu suka
Pendekatan kerja lainnya adalah mengubah nilai peta menjadi array dan kemudian mengambil elemen pada indeks. Uji coba 100 000 elemen dengan pencarian indeks di LinkedHashMap dari 100 000 objek menggunakan pendekatan berikut menghasilkan hasil sebagai berikut:
//My answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.values().toArray(newParticle[map.values().size()])[index];}//68 965 ms//Syd Lambert's answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.get((map.keySet().toArray())[ index ]);}//80 700 ms
Secara keseluruhan, mengambil elemen dengan indeks dari LinkedHashMap tampaknya merupakan operasi yang cukup berat.
HashMap - dan struktur data yang mendasarinya - tabel hash, tidak memiliki gagasan tentang posisi. Tidak seperti LinkedList atau Vector, kunci masukan diubah menjadi 'keranjang' tempat nilai disimpan. Bucket ini tidak dipesan dengan cara yang masuk akal di luar antarmuka HashMap dan oleh karena itu, item yang Anda masukkan ke HashMap tidak berurutan seperti yang Anda harapkan dengan struktur data lainnya.
HashMap tidak memiliki konsep posisi sehingga tidak ada cara untuk mendapatkan objek berdasarkan posisi. Objek di Maps diatur dan didapatkan dengan kunci.
Secara default, java LinkedHasMap tidak mendukung untuk mendapatkan nilai berdasarkan posisi. Jadi saya sarankan pergi dengan disesuaikanIndexedLinkedHashMap
publicclassIndexedLinkedHashMap<K, V>extendsLinkedHashMap<K, V>{privateArrayList<K> keysList =newArrayList<>();publicvoid add(K key, V val){super.put(key, val);
keysList.add(key);}publicvoid update(K key, V val){super.put(key, val);}publicvoid removeItemByKey(K key){super.remove(key);
keysList.remove(key);}publicvoid removeItemByIndex(int index){super.remove(keysList.get(index));
keysList.remove(index);}public V getItemByIndex(int i){return(V)super.get(keysList.get(i));}publicint getIndexByKey(K key){return keysList.indexOf(key);}}
Kemudian Anda dapat menggunakan LinkedHasMap yang disesuaikan ini sebagai
HashMaps tidak mengizinkan akses berdasarkan posisi, ia hanya mengetahui tentang kode hash dan dan dapat mengambil nilainya jika dapat menghitung kode hash dari kunci tersebut. TreeMaps memiliki gagasan tentang pengurutan. Peta Linkedhas mempertahankan urutan mereka memasuki peta.
Jawaban:
HashMaps tidak mempertahankan pemesanan:
Lihat LinkedHashMap , yang menjamin urutan iterasi yang dapat diprediksi.
sumber
Gunakan LinkedHashMap dan ketika Anda perlu mengambil berdasarkan posisi, ubah nilainya menjadi ArrayList.
sumber
Jika Anda ingin mempertahankan urutan penambahan elemen ke peta, gunakan
LinkedHashMap
sebagai lawan hanyaHashMap
.Berikut adalah pendekatan yang memungkinkan Anda mendapatkan nilai dengan indeksnya di peta:
sumber
Jika Anda, karena alasan tertentu, harus tetap menggunakan hashMap, Anda dapat mengonversi keySet ke array dan mengindeks kunci dalam array untuk mendapatkan nilai di peta seperti ini:
Anda kemudian dapat mengakses peta seperti:
sumber
String myKey = keys[i].toString();
Penggunaan
LinkedHashMap
:sumber
Gunakan LinkedHashMap dan gunakan fungsi ini.
Definisikan seperti ini dan.
Fungsi ini dapat mengembalikan entri yang dipilih.
sumber
Saya berasumsi dengan 'posisi' Anda mengacu pada urutan di mana Anda telah memasukkan elemen ke dalam HashMap. Dalam hal ini Anda ingin menggunakan LinkedHashMap. Namun LinkedHashMap tidak menawarkan metode pengakses; Anda perlu menulis satu suka
sumber
Pendekatan kerja lainnya adalah mengubah nilai peta menjadi array dan kemudian mengambil elemen pada indeks. Uji coba 100 000 elemen dengan pencarian indeks di LinkedHashMap dari 100 000 objek menggunakan pendekatan berikut menghasilkan hasil sebagai berikut:
Secara keseluruhan, mengambil elemen dengan indeks dari LinkedHashMap tampaknya merupakan operasi yang cukup berat.
sumber
HashMap - dan struktur data yang mendasarinya - tabel hash, tidak memiliki gagasan tentang posisi. Tidak seperti LinkedList atau Vector, kunci masukan diubah menjadi 'keranjang' tempat nilai disimpan. Bucket ini tidak dipesan dengan cara yang masuk akal di luar antarmuka HashMap dan oleh karena itu, item yang Anda masukkan ke HashMap tidak berurutan seperti yang Anda harapkan dengan struktur data lainnya.
sumber
HashMap tidak memiliki konsep posisi sehingga tidak ada cara untuk mendapatkan objek berdasarkan posisi. Objek di Maps diatur dan didapatkan dengan kunci.
sumber
Anda dapat menggunakan kode di bawah ini untuk mendapatkan kunci:
String [] keys = (String[]) item.keySet().toArray(new String[0]);
dan dapatkan objek atau daftar yang dimasukkan ke dalam HashMap dengan kunci item ini seperti ini:
item.get(keys[position]);
sumber
Secara default, java LinkedHasMap tidak mendukung untuk mendapatkan nilai berdasarkan posisi. Jadi saya sarankan pergi dengan disesuaikan
IndexedLinkedHashMap
Kemudian Anda dapat menggunakan LinkedHasMap yang disesuaikan ini sebagai
UNTUK menambahkan Nilai
Untuk mendapatkan nilai berdasarkan indeks
sumber
HashMaps tidak mengizinkan akses berdasarkan posisi, ia hanya mengetahui tentang kode hash dan dan dapat mengambil nilainya jika dapat menghitung kode hash dari kunci tersebut. TreeMaps memiliki gagasan tentang pengurutan. Peta Linkedhas mempertahankan urutan mereka memasuki peta.
sumber
Anda dapat mencoba menerapkan sesuatu seperti itu, lihat:
Saya harap ini berhasil untuk Anda.
sumber