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