Как сохранить порядок элементов в хэш-таблице

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

  •  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

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