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 (в литеральном виде)?
Использование lambda для форматирования Map в String
Какую структуру данных выбрать: TreeMap или HashMap? (Java)