Класс Java, который реализует Map и сохраняет порядок вставки?
-
22-08-2019 - |
Вопрос
Я ищу класс в java, который имеет ассоциацию ключ-значение, но без использования хэшей.Вот что я сейчас делаю:
- Добавлять значения к
Hashtable
. - Получите итератор для
Hashtable.entrySet()
. - Выполните итерацию по всем значениям и:
- Получить
Map.Entry
для итератора. - Создайте объект типа
Module
(пользовательский класс) на основе значения. - Добавьте класс в JPanel.
- Получить
- Покажите панель.
Проблема с этим заключается в том, что у меня нет контроля над порядком возврата значений, поэтому я не могу отобразить значения в заданном порядке (без жесткого кодирования порядка).
Я бы использовал ArrayList
или Vector
для этого, но позже в коде мне нужно захватить Module
объект для данного ключа, чего я не могу сделать с помощью ArrayList
или Vector
.
Кто-нибудь знает о свободном Java-классе с открытым исходным кодом, который будет это делать, или о способе получения значений из Hashtable
в зависимости от того, когда они были добавлены?
Спасибо!
Решение
Я предлагаю LinkedHashMap
или a TreeMap
.A LinkedHashMap
сохраняет ключи в том порядке, в котором они были вставлены, в то время как TreeMap
сохраняется отсортированным с помощью Comparator
или естественное Comparable
упорядочивание элементов.
Поскольку ему не обязательно сохранять элементы отсортированными, LinkedHashMap
должно быть быстрее для большинства случаев; TreeMap
имеет O(log n)
производительность для containsKey
, get
, put
, и remove
, согласно Javadocs, в то время как LinkedHashMap
является O(1)
для каждого.
Если ваш API ожидает только предсказуемый порядок сортировки, в отличие от определенного порядка сортировки, рассмотрите возможность использования интерфейсов, реализуемых этими двумя классами, NavigableMap
или SortedMap
.Это позволит вам не пропускать конкретные реализации в ваш API и впоследствии переключаться на любой из этих конкретных классов или совершенно другую реализацию по своему усмотрению.
Другие советы
LinkedHashMap вернет элементы в том порядке, в котором они были вставлены в карту, когда вы выполняете итерацию по набору ключей(), набору записей() или значениям() карты.
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
Если неизменяемая карта соответствует вашим потребностям тогда есть библиотека от Google под названием гуава (см . также вопросы о гуаве)
Гуава обеспечивает Неизменяемая карта с надежным порядком итераций, заданным пользователем.Это Неизменяемая карта имеет O (1) производительность для containsKey, get.Очевидно, что put и remove не поддерживаются.
Неизменяемая карта объекты создаются с использованием либо элегантных статических удобных методов из() и Копирование() или a Конструктор объект.
Вы можете поддерживать Map
(для быстрого поиска) и List
(для порядка), но a LinkedHashMap
может быть, самый простой.Вы также можете попробовать SortedMap
например , TreeMap
, которые могут иметь любой порядок, который вы укажете.
Я не знаю, с открытым исходным кодом ли это, но после небольшого поиска в Google я нашел эта реализация Map с использованием ArrayList.Кажется, это Java до версии 1.5, поэтому вы можете захотеть ее обобщить, что должно быть легко.Обратите внимание, что эта реализация имеет O (N) доступ, но это не должно быть проблемой, если вы не добавляете сотни виджетов в свою JPanel, чего в любом случае делать не следует.
Вы могли бы попробовать мой Связанная Древовидная карта реализация.
Всякий раз, когда мне нужно поддерживать естественный порядок вещей, который известен заранее, я использую Перечисляющая карта
ключи будут представлять собой перечисления, и вы можете вставлять их в любом порядке, который вы хотите, но при повторении они будут повторяться в порядке перечисления (естественном порядке).
Также при использовании EnumMap не должно быть коллизий, что может быть более эффективным.
Я действительно нахожу, что использование EnumMap обеспечивает чистый читаемый код.Вот один пример
Вы можете использовать LinkedHashMap - Связанная карта к основному порядку вставки на Карте
Важными моментами о классе Java LinkedHashMap являются:
- Он содержит только уникальные элементы.
LinkedHashMap содержит значения, основанные на ключе 3.It может иметь один нулевой ключ и несколько нулевых значений.4.It совпадает с HashMap, вместо этого поддерживает порядок вставки
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
Но если вы хотите отсортировать значения на карте с помощью пользовательского объекта или любого ключа примитивного типа данных, то вам следует использовать Древовидная карта Для получения дополнительной информации обратитесь эта ссылка