Pertanyaan Apakah mungkin untuk mendapatkan elemen dari HashMap berdasarkan posisinya?


Bagaimana cara mengambil elemen dari HashMap berdasarkan posisinya, apakah mungkin?


75
2018-03-08 19:10


asal


Jawaban:


HashMaps jangan pertahankan pemesanan:

Kelas ini tidak menjamin apa-apa   urutan peta; khususnya,   itu tidak menjamin bahwa pesanan   akan tetap konstan seiring waktu.

Melihat LinkedHashMap, yang menjamin urutan iterasi yang dapat diprediksi.


82
2018-03-08 19:15



Gunakan LinkedHashMap dan ketika Anda perlu mengambil berdasarkan posisi, ubah nilainya menjadi ArrayList.

LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>();
/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");
/* Get by position */
int pos = 1;
String value = (new ArrayList<String>(linkedHashMap.values())).get(pos);

88
2018-04-28 14:14



Jika Anda ingin mempertahankan urutan di mana Anda menambahkan elemen ke peta, gunakan LinkedHashMap sebagai lawan saja HashMap.

Berikut ini pendekatan yang memungkinkan Anda mendapatkan nilai berdasarkan indeksnya di peta:

public Object getElementByIndex(LinkedHashMap map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
}

31
2017-10-27 17:55



Menggunakan LinkedHashMap:

Tabel hash dan penerapan daftar terkait dari antarmuka Peta, dengan urutan iterasi yang dapat diprediksi. Implementasi ini berbeda dari HashMap karena ia mempertahankan daftar terkait ganda yang berjalan melalui semua entri.


11
2018-03-08 19:16



Jika Anda, karena alasan tertentu, harus tetap menggunakan hashMap, Anda dapat mengonversi keySet ke array dan mengindeks kunci dalam larik untuk mendapatkan nilai dalam peta seperti ini:

Object[] keys = map.keySet().toArray();

Anda kemudian dapat mengakses peta seperti:

map.get(keys[i]);

9
2018-06-15 10:27



Gunakan LinkedHashMap dan gunakan fungsi ini.

private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();

Tentukan seperti ini dan.

private Entry getEntry(int id){
        Iterator iterator = map.entrySet().iterator();
        int n = 0;
        while(iterator.hasNext()){
            Entry entry = (Entry) iterator.next();
            if(n == id){
                return entry;
            }
            n ++;
        }
        return null;
    }

Fungsi ini dapat mengembalikan entri yang dipilih.


6
2018-05-20 04:21



HashMap - dan struktur data yang mendasari - tabel hash, tidak memiliki gagasan posisi. Tidak seperti LinkedList atau Vector, kunci input diubah menjadi 'bucket' di mana nilai disimpan. Keranjang ini tidak diurutkan dengan cara yang masuk akal di luar antarmuka HashMap dan karena itu, item yang Anda masukkan ke dalam HashMap tidak berurutan dalam arti yang Anda harapkan dengan struktur data lainnya


2
2018-03-08 19:16



HashMap tidak memiliki konsep posisi sehingga tidak ada cara untuk mendapatkan objek dengan posisi. Objek di Maps ditetapkan dan dapatkan berdasarkan kunci.


2
2018-03-08 19:16



Saya mengasumsikan dengan 'posisi' Anda mengacu pada urutan di mana Anda telah memasukkan elemen ke dalam HashMap. Dalam hal ini Anda ingin menggunakan LinkedHashMap. The LinkedHashMap tidak menawarkan metode accessor; Anda harus menulis satu seperti

public Object getElementAt(LinkedHashMap map, int index) {
    for (Map.Entry entry : map.entrySet()) {
        if (index-- == 0) {
            return entry.value();
        }
    }
    return null;
}

2
2018-03-08 19:19



HashMaps tidak mengizinkan akses dengan posisi, hanya mengetahui tentang kode hash dan dan dapat mengambil nilai jika dapat menghitung kode hash dari kunci. TreeMaps memiliki gagasan pemesanan. Peta Linkedhas mempertahankan urutan di mana mereka memasuki peta.


1
2018-03-09 04:58