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

Удобочитаемость.

Кодирование для производительности имеет свой собственный набор проблем. Joseph M. Newcomer сказал это хорошо

вопросы Оптимизации только, когда это имеет значение. Когда это имеет значение, это имеет большое значение, но пока Вы не знаете, что это имеет значение, не тратьте впустую много времени, делая его. Даже если Вы знаете, что это имеет значение, необходимо знать, где это имеет значение. Без данных о производительности Вы не будете знать, что оптимизировать, и Вы, вероятно, оптимизируете неправильную вещь.

результат будет неясен, трудно чтобы записать, трудно отладить, и трудно поддержать код, который не решает Вашу проблему. Таким образом это имеет двойной недостаток (a) увеличивающихся затрат на разработку программного обеспечения и поддержку программного обеспечения и (b) имения никакого эффекта производительности вообще.

22
задан jimyi 14 September 2009 в 04:45
поделиться

5 ответов

Использовать LinkedHashMap .

Хеш-таблица и связанный список реализация интерфейса Map , с предсказуемым порядком итераций. Эта реализация отличается от HashMap в что он поддерживает двусвязный список пробегает все его записи. Этот связанный список определяет итерацию заказ, который обычно является заказом в котором ключи были вставлены в карта ( порядок вставки ). Обратите внимание, что порядок размещения не изменяется, если ключ повторно вставлен в карту. (А ключ k повторно вставляется в карту m, если m.put (k, v) вызывается, когда m.containsKey (k) вернет true непосредственно перед вызовом.)

в сочетании с Collections.synchronizedMap () .

Так, например:

Map<String, String> map = Collections.synchronizedMap(
  new LinkedHashMap<String, String>());
34
ответ дан 29 November 2019 в 04:40
поделиться

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

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

Из JavaDoc:

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

4
ответ дан 29 November 2019 в 04:40
поделиться

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

2
ответ дан 29 November 2019 в 04:40
поделиться

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

1
ответ дан 29 November 2019 в 04:40
поделиться

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

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

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

1
ответ дан 29 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: