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

StackOverflow https://stackoverflow.com/questions/683518

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

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

Я бы использовал 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 являются:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top