Я нашел решение, которое довольно легко читать и использовать:
Iterator<Integer> keyIterator = map.keySet().iterator();
TreeMap<Integer, Integer> newMap = map.values().stream()
.sorted()
.map(value -> new SimpleEntry<>(keyIterator.next(), value))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (l, r) -> l, TreeMap::new));
.. или меньше благодаря @ HadiJ :
map.values().stream()
.sorted()
.collect(Collectors.toMap(k -> keyIterator.next(), Function.identity(), (l, r) -> l, TreeMap::new));
... но он имеет существенный недостаток :
Я не могу гарантировать, что это будет работать параллельно, поскольку это зависит от результата keyIterator.next()
, который также не проверяется. Подробнее читайте в разделе Поведение без гражданства . Я бы предпочел не использовать java -stream таким образом.
На вашем месте я бы использовал преимущество красоты итераторов:
Iterator<Integer> values = valueList.iterator();
Iterator<Integer> keys = map.keySet().iterator();
TreeMap<Integer, Integer> newMap = new TreeMap<>(); // create a new Map
while (values.hasNext() && keys.hasNext()) { // iterate simultaneously
newMap.put(keys.next(), values.next()); // put the key-value
}