Как отмечают другие, сброс отсортированного потока записей в обычный HashMap
ничего не сделает ... LinkedHashMap
- логичный выбор.
Однако альтернативой вышеупомянутым подходам является полное использование API Stream Collectors
.
Collectors
имеет метод toMap
, который позволяет предоставить альтернативную реализацию для Map
. Таким образом, вместо HashMap
вы можете запросить LinkedHashMap
, например, так:
unsortedMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> v1, // you will never merge though ask keys are unique.
LinkedHashMap::new
));
Между использованием TreeMap и LinkedHashMap ... Сложность построения, вероятно, будет такой же, как O (n log n) ... Очевидно, что решение TreeMap
является лучшим подходом, если вы планируете продолжать добавлять больше элементы к нему ... Я думаю, вы должны были начать с TreeMap
в этом случае. Опция LinkedHashMap
имеет преимущество в том, что поиск будет O (1) на Связанной или исходной несортированной карте, тогда как TreeMap похож на O(log n)
, так что если вам нужно сохранить несортированную карту для эффективного поиска, тогда как если вы создадите LinkedHashMap, вы можете сбросить исходную несортированную карту (тем самым сэкономив немного памяти).
Чтобы сделать вещи немного более эффективными с LinkedHashMap
, вы должны предоставить хорошую оценку требуемого размера при построении, чтобы не было необходимости динамического изменения размера, поэтому вместо LinkedHashMap::new
вы говорите () -> new LinkedHashMap<>(unsortedMap.size())
.
Я считаю, что использование TreeMap
более аккуратно ... так как код меньше, поэтому, если нет реальной проблемы производительности, которую можно было бы решить с помощью подхода несортированной и отсортированной связанной карты, я бы использовал Tree
.