Подтвердить что ты не робот

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

У меня есть хэш-таблица. values ​​() возвращает значения в некотором порядке, отличные от порядка, в который я вставлен. Как я могу получить значения в том же порядке, в каком я вставил? Использование LinkedHashmap является альтернативой, но оно не синхронизировано.

4b9b3361

Ответ 1

Используйте 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>());

Ответ 2

Вы можете либо обернуть LinkedHashMap, либо синхронизировать, либо вы можете использовать утилиту Collections.synchronizedMap для создания синхронизированного LinkedHashMap:

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

Из JavaDoc:

Если несколько потоков обращаются к связанной карте хешей одновременно, и по крайней мере один из потоков изменяет структуру структурно, она должна быть синхронизирована извне. Обычно это выполняется путем синхронизации на некотором объекте, который, естественно, инкапсулирует карту. Если такой объект не существует, карта должна быть "завернута" с использованием метода Collections.synchronizedMap. Это лучше всего сделать во время создания, чтобы предотвратить случайный несинхронизированный доступ к карте.

Ответ 3

Я уверен, что причина, по которой hashtables не сортируются, - это помощь в скорости хранения и поиска. Из-за этого я бы предложил использовать внешнюю структуру для поддержания порядка и просто использовать хеш-таблицу для хранения значений (для быстрого поиска).

Ответ 4

Хэш-таблица по сути неупорядочен, поэтому вы используете неправильную структуру данных. Поскольку вы не указываете, какой язык вы используете, я не могу предложить альтернативу, но вам нужен определенный тип упорядоченного набора ключей/значений.

Ответ 5

Если jdk1.6, у вас есть только два типа упорядоченных карт EnumMap и LinkedHashMap. Оба они не синхронизированы. Если вам просто нужно запомнить заказ, используйте

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

если вы хотите отсортировать, используйте ConcurrentSkipListMap