Можно ли получить элемент из HashMap по его позиции? - PullRequest
92 голосов
/ 08 марта 2011

Как извлечь элемент из HashMap по его позиции, это вообще возможно?

Ответы [ 13 ]

98 голосов
/ 28 апреля 2011

Используйте 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);
88 голосов
/ 08 марта 2011

HashMaps не сохраняют порядок:

Этот класс не дает никаких гарантий относительно порядок карты; особенно, это не гарантирует, что заказ останется постоянным во времени.

Взгляните на LinkedHashMap , который гарантирует предсказуемый порядок итераций.

43 голосов
/ 27 октября 2015

Если вы хотите сохранить порядок, в котором вы добавили элементы на карту, используйте LinkedHashMap вместо HashMap.

Вот подход, который позволит вам получить значение по его индексу на карте:

public Object getElementByIndex(LinkedHashMap map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
}
15 голосов
/ 15 июня 2017

Если вам по какой-то причине нужно придерживаться hashMap, вы можете преобразовать набор ключей в массив и проиндексировать ключи в массиве, чтобы получить значения на карте следующим образом:

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

Затем вы можете получить доступ к карте, как:

map.get(keys[i]);
12 голосов
/ 08 марта 2011

Использование LinkedHashMap:

Реализация хеш-таблицы и связанного списка интерфейса Map с предсказуемым порядком итераций. Эта реализация отличается от HashMap тем, что поддерживает двусвязный список, проходящий через все его записи.

6 голосов
/ 20 мая 2013

Используйте 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;
    }

Функция может вернуть выбранную запись.

3 голосов
/ 06 декабря 2016

Другой рабочий подход - преобразование значений карты в массив, а затем получение элемента по индексу.Тестовый запуск 100 000 элементов с помощью поиска по индексу в 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 представляется довольно сложной операцией.*

2 голосов
/ 08 марта 2011

Я предполагаю, что под «позицией» вы ссылаетесь на порядок, в котором вы вставили элементы в HashMap. В этом случае вы хотите использовать LinkedHashMap. Однако LinkedHashMap не предлагает метод доступа; вам нужно написать один как

public Object getElementAt(LinkedHashMap map, int index) {
    for (Map.Entry entry : map.entrySet()) {
        if (index-- == 0) {
            return entry.value();
        }
    }
    return null;
}
2 голосов
/ 08 марта 2011

HashMap не имеет понятия позиции, поэтому нет способа получить объект по позиции. Объекты в Картах устанавливаются и выбираются по ключам.

2 голосов
/ 08 марта 2011

HashMap - и основная структура данных - хеш-таблицы, не имеют понятия позиции. В отличие от LinkedList или Vector, клавиша ввода преобразуется в «корзину», где хранится значение. Эти сегменты не упорядочены таким образом, который имеет смысл вне интерфейса HashMap, и поэтому элементы, которые вы помещаете в HashMap, расположены не по порядку в том смысле, в котором вы ожидаете использовать другие структуры данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...