Класс Java, который реализует Map и сохраняет порядок вставки? - PullRequest
411 голосов
/ 26 марта 2009

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

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

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

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

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

Спасибо!

Ответы [ 8 ]

655 голосов
/ 26 марта 2009

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

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

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

15 голосов
/ 09 мая 2017

LinkedHashMap вернет элементы в том порядке, в котором они были вставлены в карту, когда вы выполняете итерации по keySet (), 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 
15 голосов
/ 27 августа 2010

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

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

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

6 голосов
/ 27 марта 2009

Вы можете сохранить Map (для быстрого поиска) и List (для заказа), но LinkedHashMap может быть самым простым. Вы также можете попробовать SortedMap, например. TreeMap, в котором вы можете указать любой заказ.

1 голос
/ 09 ноября 2017

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

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

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

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

1 голос
/ 03 февраля 2010

Вы можете попробовать мою реализацию Linked Tree Map .

1 голос
/ 26 марта 2009

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

0 голосов
/ 02 мая 2018

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...