วิธีการดึงองค์ประกอบจาก HashMap ตามตำแหน่งเป็นไปได้หรือไม่?
วิธีการดึงองค์ประกอบจาก HashMap ตามตำแหน่งเป็นไปได้หรือไม่?
คำตอบ:
HashMapsไม่สงวนลำดับ:
ชั้นนี้ไม่รับประกันเกี่ยวกับลำดับของแผนที่ โดยเฉพาะอย่างยิ่งไม่รับประกันว่าคำสั่งซื้อจะคงที่ตลอดเวลา
ลองดูLinkedHashMapซึ่งรับประกันลำดับการทำซ้ำที่คาดเดาได้
ใช้ LinkedHashMap และเมื่อคุณต้องการดึงข้อมูลตามตำแหน่งให้แปลงค่าเป็น 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);
    หากคุณต้องการรักษาลำดับที่คุณเพิ่มองค์ประกอบลงในแผนที่ให้ใช้LinkedHashMapตรงข้ามกับ justHashMapเป็นนอกคอกเพียง
นี่คือแนวทางที่จะช่วยให้คุณได้รับค่าจากดัชนีในแผนที่:
public Object getElementByIndex(LinkedHashMap map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
}
    หากคุณต้องยึดติดกับ hashMap ด้วยเหตุผลบางประการคุณสามารถแปลง keySet เป็นอาร์เรย์และทำดัชนีคีย์ในอาร์เรย์เพื่อรับค่าในแผนที่ดังนี้:
Object[] keys = map.keySet().toArray();
จากนั้นคุณสามารถเข้าถึงแผนที่เช่น:
map.get(keys[i]);
    String myKey = keys[i].toString();
                    ใช้LinkedHashMap:
ตารางแฮชและการใช้งานรายการที่เชื่อมโยงของอินเทอร์เฟซแผนที่พร้อมลำดับการทำซ้ำที่คาดเดาได้ การใช้งานนี้แตกต่างจาก HashMap ตรงที่มีการเก็บรักษารายการที่เชื่อมโยงแบบทวีคูณซึ่งรันผ่านรายการทั้งหมด
ใช้ LinkedHashMap และใช้ฟังก์ชันนี้
private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
กำหนดเช่นนี้และ.
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;
    }
ฟังก์ชันสามารถส่งคืนรายการที่เลือก
ฉันสมมติว่าตาม 'ตำแหน่ง' คุณหมายถึงลำดับที่คุณแทรกองค์ประกอบลงใน HashMap ในกรณีนี้คุณต้องการใช้ LinkedHashMap LinkedHashMap ไม่มีวิธีการเข้าถึงอย่างไรก็ตาม คุณจะต้องเขียนสิ่งที่ชอบ
public Object getElementAt(LinkedHashMap map, int index) {
    for (Map.Entry entry : map.entrySet()) {
        if (index-- == 0) {
            return entry.value();
        }
    }
    return null;
}
    วิธีการทำงานอีกวิธีหนึ่งคือการเปลี่ยนค่าแผนที่เป็นอาร์เรย์จากนั้นดึงองค์ประกอบที่ดัชนี การทดสอบการทำงานของ 100000 องค์ประกอบโดยการค้นหาดัชนีใน LinkedHashMap ของ 100,000 อ็อบเจ็กต์โดยใช้วิธีการต่อไปนี้นำไปสู่ผลลัพธ์ต่อไปนี้:
//My answer:
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){
    return map.values().toArray(new Particle[map.values().size()])[index];
} //68 965 ms
//Syd Lambert's answer:
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
} //80 700 ms
ในองค์ประกอบการดึงข้อมูลทั้งหมดโดยดัชนีจาก LinkedHashMap ดูเหมือนจะใช้งานได้ค่อนข้างหนัก
HashMap - และโครงสร้างข้อมูลพื้นฐาน - ตารางแฮชไม่มีความคิดเกี่ยวกับตำแหน่ง ไม่เหมือนกับ LinkedList หรือ Vector คีย์อินพุตจะถูกเปลี่ยนเป็น 'ที่เก็บข้อมูล' ที่เก็บค่าไว้ ที่เก็บข้อมูลเหล่านี้ไม่ได้เรียงลำดับในลักษณะที่สมเหตุสมผลนอกอินเทอร์เฟซ HashMap และด้วยเหตุนี้รายการที่คุณใส่ลงใน HashMap จึงไม่เป็นไปตามที่คุณคาดหวังจากโครงสร้างข้อมูลอื่น ๆ
HashMap ไม่มีแนวคิดเกี่ยวกับตำแหน่งดังนั้นจึงไม่มีวิธีรับวัตถุตามตำแหน่ง วัตถุในแผนที่ถูกตั้งค่าและรับด้วยกุญแจ
คุณสามารถใช้รหัสด้านล่างเพื่อรับรหัส: 
String []  keys = (String[]) item.keySet().toArray(new String[0]);
และรับวัตถุหรือรายการที่แทรกใน HashMap ด้วยคีย์ของรายการนี้ดังนี้:
item.get(keys[position]);
ตามค่าเริ่มต้น java LinkedHasMap ไม่สนับสนุนการรับค่าตามตำแหน่ง ดังนั้นฉันขอแนะนำให้ไปปรับแต่งIndexedLinkedHashMap
public class IndexedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
    private ArrayList<K> keysList = new ArrayList<>();
    public void add(K key, V val) {
        super.put(key, val);
        keysList.add(key);
    }
    public void update(K key, V val) {
        super.put(key, val);
    }
    public void removeItemByKey(K key) {
        super.remove(key);
        keysList.remove(key);
    }
    public void removeItemByIndex(int index) {
        super.remove(keysList.get(index));
        keysList.remove(index);
    }
    public V getItemByIndex(int i) {
        return (V) super.get(keysList.get(i));
    }
    public int getIndexByKey(K key) {
        return keysList.indexOf(key);
    }
}
จากนั้นคุณสามารถใช้ LinkedHasMap ที่กำหนดเองนี้เป็น
IndexedLinkedHashMap<String,UserModel> indexedLinkedHashMap=new IndexedLinkedHashMap<>();
เพื่อเพิ่มค่า
indexedLinkedHashMap.add("key1",UserModel);
เพื่อ getValue ตามดัชนี
indexedLinkedHashMap.getItemByIndex(position);
    HashMaps ไม่อนุญาตให้เข้าถึงตามตำแหน่ง แต่จะรู้เกี่ยวกับรหัสแฮชเท่านั้นและสามารถดึงค่าได้หากสามารถคำนวณรหัสแฮชของคีย์ได้ TreeMaps มีแนวคิดในการสั่งซื้อ แผนที่ Linkedhas รักษาลำดับที่เข้าสู่แผนที่
คุณสามารถลองใช้บางสิ่งเช่นนั้นดูที่:
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("juan", 2);
map.put("pedro", 3);
map.put("pablo", 5);
map.put("iphoncio",9)
List<String> indexes = new ArrayList<String>(map.keySet()); // <== Parse
System.out.println(indexes.indexOf("juan"));     // ==> 0
System.out.println(indexes.indexOf("iphoncio"));      // ==> 3
ฉันหวังว่านี่จะเหมาะกับคุณ