Класс 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 дополнительную информацию см. этой ссылке