Доступ к карте через индекс?



Является ли это tossibe к aceess a Map<Integer, Integer> через индекс?



Мне нужно получить второй элемент карты.

318   8  

8 ответов:

Вы используете неправильную структуру данных. Если вам нужен поиск по ключу, вы используете Map. Если вам нужен поиск по индексу или порядку вставки, используйте что-то, что позволяет вам индексировать, например массив, список или связанный список.

Если вам нужно искать по обоим, то вам нужно создать составную структуру данных, которая отслеживает как ключи, так и порядок вставки (реализация будет поддерживаться Map и одной из вышеупомянутых структур данных).

Есть даже один встроенный в каркас: LinkedHashMap.

Нет прямого способа доступа к карте "через индекс", но похоже, что вы хотите получить LinkedHashMap, что обеспечивает предсказуемый порядок итерации:

... который обычно является порядком, в котором ключи были вставлены в карту (порядок вставки). Обратите внимание, что порядок вставки не изменяется, если ключ повторно вставляется в карту. (Ключ k повторно вставляется в карту m, если m.put(k, v) вызывается, когда m.containsKey(k) возвращает true непосредственно перед вызовом.)

Определение индекса неприменимо к Map, так как по умолчанию это не упорядоченная коллекция.

Можно использовать TreeMap, который реализует NavigableMap, а затем повторить набор ключей с помощью метода navigableKeySet().

Если вам просто нужно постоянно получать второй элемент. Почему бы не использовать итератор, а затем сделать следующий, следующий.

Это будет зависеть от реализации Map, но если вы хотите получить второй вставленный элемент, вы можете использовать LinkedHashMap, а затем создать итератор по значениям.

Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();

map.put(1, 1);
map.put(2, 2);

Integer value = null;
if (map.size() > 1) {
    Iterator<Integer> iterator = map.values().iterator();
    for (int i = 0; i < 2; i++) {
        value = iterator.next();
    }
}

// value contains second element
System.out.println(value);

Map не хранит элементы в порядке вставки. Он хранит элементы в корзинах на основе значения хеш-кода элемента, который хранится. Так что нет, вы не можете получить его по индексу.

В любом случае, вы можете имитировать что-то подобное, используя реализацию LinkedHashMap интерфейса Map, который запоминает порядок вставки (разблокируйте HashMap).

Вам придется "взломать" с помощью ручного счетчика индекса, и код будет выглядеть что-то вроде этого:

Map<String, String> map= new LinkedHashMap<>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
int index= 0;

for (String key : map.keySet()) {
    if (index++ == 1) {
        System.out.println(map.get(key));
    }
}

Напечатает:

"two"

Чего вы и добиваетесь.

Вы также можете использовать org.апаш.палата общин.коллекции.карта.ListOrderedMap из коллекции Apache commons. Он реализует Map и предоставляет некоторые методы из интерфейса списка, такие как get (int index) и remove(int index).

Он использует ArrayList внутренне, поэтому производительность будет лучше, чем итерация на карте для получения значения в указанной позиции.

Не уверен, что это какой-то "очиститель", но: Если использовать LinkedHashMap и вы хотите получить вставленный элемент, то будет работать второй следующий

List keys = new ArrayList(map.keySet());
Object obj = map.get(keys.get(1));
    //do you staff here 

Comments

    Ничего не найдено.