Класс Java, который реализует карту и сохраняет порядок вставки?


Я ищу класс в java, который имеет ассоциацию ключ-значение, но без использования хэшей. Вот что я сейчас делаю:

  1. добавить значения к Hashtable.
  2. получить iterator для Hashtable.entrySet().
  3. перебрать все значения и:
    1. получить Map.Entry для итератора.
    2. создать объект типа Module (пользовательский класс) на основе значения.
    3. добавить класс В a JPanel.
  4. Показать панель.

проблема в том, что у меня нет контроля над порядком, в котором я получаю значения обратно, поэтому я не могу отображать значения в заданном порядке (без жесткого кодирования порядка).

Я бы использовал ArrayList или Vector для этого, но позже в коде мне нужно, чтобы захватить Module объект для данного ключа, который я не могу с ArrayList или Vector.

кто-нибудь знает свободным/открытым исходным кодом Java-класс, который будет делать это, или способ, чтобы получить значения из Hashtable на основе того, когда они были добавлены?

спасибо!

8 371

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 (для порядка) но a LinkedHashMap может быть самым простым. Вы также можете попробовать SortedMap например TreeMap, который имеет любой заказ, который вы укажете.

Я не знаю, является ли это открытым исходным кодом, но после небольшого поиска в Интернете я нашел эта реализация карты с использованием ArrayList. Это, кажется, pre-1.5 Java, поэтому вы можете захотеть его обобщить, что должно быть легко. Обратите внимание, что эта реализация имеет доступ O(N), но это не должно быть проблемой, если вы не добавляете сотни виджетов в свою JPanel, чего вы все равно не должны делать.

вы могли бы попробовать мой Карта Связанного Дерева реализация.

всякий раз, когда мне нужно поддерживать естественный порядок вещей, которые известны заранее, я использую EnumMap

ключи будут перечислениями, и вы можете вставлять в любом порядке, но когда вы повторяете его, он будет повторяться в порядке перечисления (естественный порядок).

также при использовании EnumMap не должно быть коллизий, которые могут быть более эффективными.

Я действительно считаю, что использование enumMap делает для чистого читаемого кода. Вот пример

можно использовать LinkedHashMap к основному порядку вставки на карте

важными моментами о классе Java LinkedHashMap являются:

  1. он содержит только Unique элементы.
  2. LinkedHashMap содержит значения, основанные на ключе 3.It может иметь один нулевой ключ и несколько нулевых значений. 4.It это же, как HashMap вместо этого поддерживает порядок вставки

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 
    

но если вы хотите сортировать значения в карте с помощью Определяемый пользователем объект или любой примитивный ключ типа данных, то вы должны использовать TreeMap дополнительную информацию см. этой ссылке