У меня есть такая HashMap:
public final Map<String, MyClass> myMap = new HashMap<>();
А теперь мне нужно отсортировать хэш-карту, определить предел и преобразовать в ArrayList. Я выполнил приведенный ниже код:
List<MyClass> collect = myMap.values().stream().sorted((m1, m2) -> Double.compare(m2.getSomething(), m1.getSomething())).limit(amount).collect(Collectors.toList());
Проблема в том, что этот код неэффективен и неэффективен. myMap огромен, поэтому код требует слишком много времени для завершения. Есть идеи, как разобраться со сценарием?
Любая помощь приветствуется. Спасибо!
Как amount связан с размером карты? Мол, это половина этого размера, или 10%, или всего несколько предметов? Я хочу сказать, что если amount низкий, вам не нужно сортировать остальную часть карты.




Если ваш Map действительно такой большой, как вы говорите, есть вероятность, что вы можете извлечь выгоду из использования параллельного потока вместо последовательного. Кроме того, предполагая, что MyClass#getSomething возвращает double, вы можете использовать Comparator#comparingDouble:
List<MyClass> collect;
collect = myMap.values()
.parallelStream()
.sorted(Comparator.comparingDouble(MyClass::getSomething).reversed())
.limit(amount)
.collect(Collectors.toList());
Я разделил объявление и инициализацию на две строки, чтобы они занимали немного меньше места.
Другим решением может быть создание карты упорядоченным образом, чтобы избежать сортировки после?
Я не уверен, что встроенные классы (такие как TreeMap) позволяют создавать Map, сортируя его по значению, но вам все равно придется каким-то образом получить элемент n.
Это изменение кода еще не работает так, как необходимо. Было бы выгоднее изменить хэш-карту на простой массив?
Когда я запускаю этот код, требуется 2 часа. Если я удалю отсортированную функцию, код займет 23 секунды. Проблема в том, что мне нужна отсортированная функция