Отсортируйте HashMap, определите предел и преобразуйте его в ArrayList

У меня есть такая 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 огромен, поэтому код требует слишком много времени для завершения. Есть идеи, как разобраться со сценарием?

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

Когда я запускаю этот код, требуется 2 часа. Если я удалю отсортированную функцию, код займет 23 секунды. Проблема в том, что мне нужна отсортированная функция

user2403973 28.06.2018 02:48

Как amount связан с размером карты? Мол, это половина этого размера, или 10%, или всего несколько предметов? Я хочу сказать, что если amount низкий, вам не нужно сортировать остальную часть карты.

lexicore 28.06.2018 09:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
55
1

Ответы 1

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

List<MyClass> collect;

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

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

Другим решением может быть создание карты упорядоченным образом, чтобы избежать сортировки после?

user2403973 28.06.2018 13:57

Я не уверен, что встроенные классы (такие как TreeMap) позволяют создавать Map, сортируя его по значению, но вам все равно придется каким-то образом получить элемент n.

Jacob G. 28.06.2018 14:02

Это изменение кода еще не работает так, как необходимо. Было бы выгоднее изменить хэш-карту на простой массив?

user2403973 28.06.2018 16:27

Другие вопросы по теме