Как сохранить порядок элементов в хэш-таблице
-
07-07-2019 - |
Вопрос
У меня есть хэш - таблица .метод values() возвращает значения в некотором порядке, отличном от порядка, в котором я был вставлен.Как я могу получить значения в том же порядке, в котором я вставил?Использование LinkedHashMap является альтернативой, но оно не синхронизировано.
Решение
Используйте LinkedHashMap
.
Хэш-таблица и связанный список реализация
Map
интерфейс, с предсказуемым порядком итераций.Эта реализация отличается отHashMap
в том, что он поддерживает двусвязный список , проходящий через все его записи.Этот связанный список определяет порядок итераций , который обычно соответствует порядку , в котором ключи были вставлены в карту (порядок вставки).Обратите внимание, что порядок вставки не изменяется, если используется ключ повторно вставленный на карту.(A ключ k повторно вставляется в карту m, еслиm.put(k, v)
вызывается, когдаm.containsKey(k)
вернулся быtrue
непосредственно перед вызовом.)
в сочетании с Collections.synchronizedMap()
.
Так, например:
Map<String, String> map = Collections.synchronizedMap(
new LinkedHashMap<String, String>());
Другие советы
Вы могли бы либо обернуть LinkedHashMap
и синхронизировать, или вы могли бы использовать Collections.synchronizedMap
утилита для создания синхронизированного LinkedHashMap
:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Из JavaDoc:
Если несколько потоков обращаются к связанной хэш-карте одновременно, и хотя бы один из потоков изменяет карту структурно, она должна быть синхронизирована извне.Обычно это достигается путем синхронизации с каким-либо объектом, который естественным образом инкапсулирует карту.Если такого объекта не существует, карту следует "обернуть" с помощью Collections.Метод synchronizedMap.Лучше всего это делать во время создания, чтобы предотвратить случайный несинхронизированный доступ к карте
Я почти уверен, что причина, по которой хэш-таблицы не сортируются, заключается в повышении скорости хранения и извлечения данных.Из-за этого я бы предложил использовать внешнюю структуру для поддержания порядка и просто использовать хэш-таблицу для хранения значений (для быстрого поиска).
Хэш-таблица по своей сути неупорядочена, поэтому вы используете неправильную структуру данных.Поскольку вы не указываете, какой язык вы используете, я не могу предложить альтернативный вариант, но вам нужен какой-то упорядоченный набор ключей / значений.
Если jdk1.6, то у вас есть только два типа упорядоченной карты EnumMap и LinkedHashMap.Оба они не синхронизированы.Если вам просто нужно запомнить порядок, используйте
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
если вы хотите отсортировать, используйте ConcurrentSkipListMap