Java-класс, реализующий Map и сохраняющий порядок вставки?
Я ищу класс на Java, который будет использовать ассоциацию "ключ-значение", но без использования хэш-таблиц. Вот что я сейчас делаю:
- Добавляю значения в
Hashtable
. - Получаю итератор для
Hashtable.entrySet()
. - Прохожу по всем значениям и:
- Получаю
Map.Entry
для итератора. - Создаю объект типа
Module
(это собственный класс) на основе значения. - Добавляю класс в JPanel.
- Получаю
- Отображаю панель.
Проблема в том, что я не контролирую порядок, в котором получаю значения, и не могу отображать их в заданном порядке (без жесткого кодирования порядка).
Я мог бы использовать ArrayList
или Vector
для этой задачи, но позже в коде мне нужно получить объект Module
по данному ключу, что нельзя сделать с помощью ArrayList
или Vector
.
Есть ли у кого-то информация о свободном или открытом классе Java, который бы это выполнял, или способ извлечения значений из Hashtable
в порядке добавления?
Спасибо!
3 ответ(ов)
LinkedHashMap
будет возвращать элементы в порядке их вставки в карту при итерации через keySet()
, entrySet()
или values()
.
Рассмотрим следующий пример кода:
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
Этот код выведет элементы в том порядке, в котором они были добавлены в карту:
id = 1
name = rohan
age = 26
Таким образом, LinkedHashMap
сохраняет порядок вставки элементов, что может быть очень удобно в случае, если вам нужен предсказуемый порядок обхода.
Вы можете использовать Map
(для быстрой выборки) и List
(для сохранения порядка), но самым простым вариантом может быть LinkedHashMap
. Вы также можете рассмотреть использование SortedMap
, например, TreeMap
, который позволяет задать любой порядок, который вам нужен.
LinkedHashMap используется для сохранения порядка вставки. Класс LinkedHashMap из коллекций является реализацией интерфейса Map с использованием Hashtable и LinkedList. Он хранит свои записи в Hashtable и использует двусвязный список для поддержания порядка вставки.
Рассмотрим пример на Java для поиска первого неповторяющегося символа. В следующем примере первым неповторяющимся символом является 't'.
Пример кода 1:
String str = "Stress";
Character ch = str.toLowerCase().chars()
.mapToObj(c -> Character.valueOf((char) c))
.collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()))
.entrySet()
.stream()
.filter(entry -> entry.getValue() == 1)
.map(entry -> entry.getKey())
.findFirst()
.get();
Пример кода 2:
String str = "Stress";
Character ch = str.toLowerCase().chars()
.mapToObj(c -> Character.valueOf((char) c))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(entry -> entry.getValue() == 1)
.map(entry -> entry.getKey())
.findFirst()
.get();
В первом примере кода я использовал LinkedHashMap, который сохраняет порядок вставки, поэтому мы получаем ожидаемый результат. Во втором примере мы не сохраняем никакого порядка вставки, в связи с чем результат оказывается неверным.
Эффективный способ итерации по каждой записи в Java Map?
Как инициализировать статическую Map?
Разница между HashMap, LinkedHashMap и TreeMap
Сортировка Map<Key, Value> по значениям
Как преобразовать Map в List в Java?