Я ищу класс в Java, который имеет связь ключ-значение, но без использования хэшей. Вот что я сейчас делаю:
- Добавить значения в
Hashtable
. - Получить итератор для
Hashtable.entrySet()
. - Переберите все значения и:
- Получить
Map.Entry
для итератора. - Создайте объект типа
Module
(пользовательский класс) на основе значения. - Добавьте класс в JPanel.
- Получить
- Показать панель.
Проблема в том, что у меня нет контроля над порядком получения значений, поэтому я не могу отобразить значения в заданном порядке (без жесткого кодирования порядка).
Я бы использовал ArrayList
или Vector
для этого, но позже в коде мне нужно получить Module
объект для данного ключа, что я не могу сделать с ArrayList
или Vector
.
Кто-нибудь знает о свободном / с открытым исходным кодом Java-классе, который это сделает, или о способе получения значений на Hashtable
основе того, когда они были добавлены?
Спасибо!
java
dictionary
key-value
Шейн
источник
источник
Ответы:
Я предлагаю
LinkedHashMap
илиTreeMap
. ALinkedHashMap
сохраняет ключи в том порядке, в котором они были вставлены, в то время как aTreeMap
сортируется с помощьюComparator
или естественногоComparable
упорядочения элементов.Поскольку элементы не
LinkedHashMap
должны сортироваться, в большинстве случаев они должны выполняться быстрее;TreeMap
имеетO(log n)
производительностьcontainsKey
,get
,put
, иremove
, в соответствии с Javadocs, в то время какLinkedHashMap
этоO(1)
для каждого.Если ваш API, который ожидает только предсказуемый порядок сортировки, в отличие от определенного порядка сортировки, рассмотрите возможность использования интерфейсов, которые реализуют эти два класса,
NavigableMap
илиSortedMap
. Это позволит вам не пропускать конкретные реализации в ваш API и впоследствии переключаться на эти конкретные классы или на совершенно другую реализацию.источник
LinkedHashMap будет возвращать элементы в том порядке, в котором они были вставлены в карту, когда вы выполняете итерации по keySet (), entrySet () или values () карты.
Это напечатает элементы в порядке их размещения на карте:
источник
Если неизменяемая карта соответствует вашим потребностям, есть библиотека от Google, которая называется guava (см. Также вопросы по guava )
Guava предоставляет ImmutableMap с надежным заданным пользователем порядком итераций. Этот ImmutableMap имеет производительность O (1) для containsKey, get. Очевидно, положить и удалить не поддерживаются.
Объекты ImmutableMap создаются с использованием элегантных статических вспомогательных методов () и copyOf () или объекта Builder .
источник
Вы можете поддерживать
Map
(для быстрого поиска) иList
(для заказа), ноLinkedHashMap
может быть самым простым. Вы также можете попробовать,SortedMap
напримерTreeMap
, какой-либо заказ вы указали.источник
Я не знаю, является ли это открытым исходным кодом, но после небольшого поиска в Google я нашел эту реализацию Map, используя ArrayList . Похоже, что это Java до версии 1.5, так что вы можете обобщить ее, что должно быть легко. Обратите внимание, что эта реализация имеет O (N) доступ, но это не должно быть проблемой, если вы не добавляете сотни JPG-элементов в свой виджет, что в любом случае не следует.
источник
Вы можете попробовать мою реализацию Linked Tree Map .
источник
Всякий раз, когда мне нужно поддерживать естественный порядок вещей, которые известны заранее, я использую EnumMap
ключи будут перечислениями, и вы можете вставлять их в любом порядке, который вы хотите, но при повторении он будет повторяться в порядке перечисления (естественный порядок).
Также при использовании EnumMap не должно быть столкновений, которые могут быть более эффективными.
Я действительно считаю, что использование enumMap делает для чистого читаемого кода. Вот пример
источник
Вы можете использовать LinkedHashMap для основного порядка вставки в карте
Важными моментами о классе Java LinkedHashMap являются:
LinkedHashMap содержит значения, основанные на ключе 3. Он может иметь один нулевой ключ и несколько нулевых значений. 4. Он такой же, как HashMap, вместо этого поддерживает порядок вставки
Но если вы хотите отсортировать значения в карте, используя определяемый пользователем объект или любой примитивный ключ типа данных, то вам следует использовать TreeMap. Для получения дополнительной информации перейдите по этой ссылке.
источник
Либо Вы можете использовать,
LinkedHashMap<K, V>
либо можете реализовать свою собственную CustomMap, которая поддерживает порядок вставки.Вы можете использовать следующее
CustomHashMap
со следующими функциями:null
или пустыми строками не допускаются.HashMap
противLinkedHashMap
противCustomHashMap
Использование
CustomHashMap
:O / P:
Если вы знаете, что KEY исправлены, вы можете использовать EnumMap. Получить значения формы Свойства / XML файлы
EX:
источник