Можно ли получить элемент из HashMap по его позиции?

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

map.get(keys[i]);

Ответ 5

Используйте LinkedHashMap:

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

Другим рабочим подходом является преобразование значений карты в массив и последующее извлечение элемента по индексу. Тестирование 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 answer:
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
} //80 700 ms

В целом получение элемента по индексу из LinkedHashMap выглядит довольно тяжелой.

Ответ 11

HashMaps не разрешает доступ по позиции, он знает только хэш-код и может получить значение, если он может вычислить хэш-код ключа. У TreeMaps есть понятие упорядочения. Карты Linkedhas сохраняют порядок, в который они вошли на карту.

Ответ 12

Вы можете попытаться реализовать что-то подобное, посмотрите на:

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

Я надеюсь, что это сработает для вас.

Ответ 13

Вы можете использовать приведенный ниже код для получения ключа: String [] keys = (String[]) item.keySet().toArray(new String[0]);

и получить объект или список, которые вставляются в HashMap с ключом этого элемента следующим образом: item.get(keys[position]);