Сортировать HashMap, определить предел и преобразовать в ArrayList - PullRequest
0 голосов
/ 28 июня 2018

У меня есть HashMap, как это:

public final Map<String, MyClass> myMap = new HashMap<>();

А теперь мне нужно отсортировать эту хэш-карту, определить limt и преобразовать в ArrayList. Я сделал код ниже:

List<MyClass> collect = myMap.values().stream().sorted((m1, m2) -> Double.compare(m2.getSomething(), m1.getSomething())).limit(amount).collect(Collectors.toList());

Проблема в том, что этот код не является производительным и эффективным. myMap огромен, поэтому его завершение занимает слишком много времени. Есть идеи, как бороться со сценарием?

Любая помощь приветствуется. Спасибо!

1 Ответ

0 голосов
/ 28 июня 2018

Если ваш Map действительно такой большой, как вы говорите, есть потенциал, что вы можете получить выгоду от использования параллельного потока вместо последовательного. Кроме того, предполагая, что MyClass#getSomething возвращает double, вы можете использовать Comparator#comparingDouble:

List<MyClass> collect;

collect = myMap.values()
               .parallelStream()
               .sorted(Comparator.comparingDouble(MyClass::getSomething).reversed())
               .limit(amount)
               .collect(Collectors.toList());

Я разделил объявление и инициализацию на две строки, чтобы они занимали немного меньше места.

...