2015-01-23 5 views
0

У меня есть HashMap.Итерация HashMap в порядке

У этого есть 100s миллионов наблюдений.

Каков наилучший способ перебора элементов HashMap в числовом порядке ключей?

Я рассматривал переход на TreeMap, но не сделал этого, так как он может фактически увеличить нагрузку при создании Карты (поскольку TreeMap - это O (n), HashMap - O (1)).

+2

Эта проблема довольно сложна: (1) 'HashMap' неупорядочен; вы, вероятно, захотите «TreeMap» или создать свою собственную структуру (2) сотни миллионов наблюдений, скорее всего, ударят по вашей памяти в одной системе. При выборе структуры данных рассмотрите, какие операции вы будете выполнять чаще всего и оптимизируйте для этих случаев. Имейте в виду - если ваши данные уже отсортированы, вы никогда не получите сортировку O (1) – Krease

+1

Являются ли клавиши последовательными номерами? Если нет, тогда вам придется делать что-то сортировочное, что будет стоить независимо от того, что. –

+0

Вам нужен LinkedHashMap. См. Здесь: http://stackoverflow.com/questions/3478061/does-javas-linkedhashmap-maintain-the-order-of-keys –

ответ

4

С Java-можно использовать что-то похожее на следующее:

import static java.util.Comparator.comparing; 

map.entrySet().stream() 
    .sorted(comparing(Entry::getKey)) 
    .forEach(e -> doSomethingWithTheEntry(e)); 

Это, очевидно, будет связано с сортировкой несортированных ключей, которые будут стоить дорого. Поэтому вам нужно решить, хотите ли вы заплатить авансовую стоимость с помощью TreeMap или по необходимости и продолжать использовать HashMap.

+0

Спасибо ... Это похоже на жизнеспособное решение. Я оценил оба варианта, и похоже, что TreeMap на самом деле не сильно ударил по производительности, так что, наконец, это удалось. – KalEl

2

Вы не можете перебирать по порядку номер HashMap. Для этого вам нужно будет использовать TreeMap. Если вы используете LinkedHashMap, вы можете выполнить итерацию в том порядке, в котором ключи были вставлены в Map, но это все еще не то, что вы хотите (если вы не вставляете ключи в числовом порядке).

2

Если ваш заказ на вставку совпадает с вашим ключом, вы можете использовать LinkedHashMap.

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

+0

Спасибо, к сожалению, они не вставлены в натуральном порядке. – KalEl

Смежные вопросы