Вопрос-ответ

Java Class that implements Map and keeps insertion order?

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

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


  1. Добавляйте значения в a Hashtable.

  2. Получаем итератор для Hashtable.entrySet().

  3. Перебирать все значения и:

    1. Получаем Map.Entry для итератора.

    2. Создайте объект типа Module (пользовательский класс) на основе значения.

    3. Добавьте класс в JPanel.


  4. Показать панель.

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

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

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

Спасибо!

Переведено автоматически
Ответ 1

Я предлагаю LinkedHashMap или a TreeMap. A LinkedHashMap сохраняет ключи в том порядке, в котором они были вставлены, в то время как a TreeMap сортируется через Comparator или естественный Comparable порядок ключей.

Поскольку ему не нужно сохранять элементы отсортированными, LinkedHashMap должно быть быстрее для большинства случаев; TreeMap имеет O(log n) производительность для containsKey, get, put, и remove, согласно Javadocs, в то время как LinkedHashMap есть O(1) для каждого.

Если ваш API ожидает только предсказуемый порядок сортировки, в отличие от определенного порядка сортировки, рассмотрите возможность использования интерфейсов, реализуемых этими двумя классами, NavigableMap или SortedMap. Это позволит вам не пропускать конкретные реализации в свой API и впоследствии переключаться на любой из этих конкретных классов или совершенно другую реализацию по желанию.

Ответ 2

LinkedHashMap вернет элементы в том порядке, в котором они были вставлены в карту, когда вы выполняете итерацию по набору ключей(), entrySet() или values() карты.

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
Ответ 3

Если неизменяемая карта соответствует вашим потребностям, то в Google есть библиотека под названием guava (см. Также Вопросы по guava)

Guava предоставляет ImmutableMap с надежным заданным пользователем порядком итераций. Эта неизменяемая карта имеет производительность O (1) для containsKey, get . Очевидно, что put и remove не поддерживаются.

Объекты ImmutableMap создаются с использованием либо элегантных статических удобных методов of() и copyOf(), либо объекта Builder.

Ответ 4

Вы можете использовать LinkedHashMap для основного порядка вставки в Map

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


  1. Он содержит только уникальные элементы.



  2. LinkedHashMap содержит значения, основанные на ключе.



  3. Он может иметь один нулевой ключ и несколько нулевых значений.



  4. Это то же самое, что и HashMap, вместо этого поддерживающий порядок вставки


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


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

java