Как получить элемент из 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]);