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