Сортировать массив массивов буферов и получить подмножество в Scala - PullRequest
0 голосов
/ 12 марта 2019

У меня есть массив буферов пользовательского объекта Employee, который имеет empname, empno, joiningdate

Я хотел отсортировать ArrayBuffer по дате соединения с порядком desc и получить топ 10

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

Невозможно сделать то же самое в запросе базы данных, так как я использую cassandra db, где я не могу сделать то же самое для некластерных столбцов

val employeeList: mutable.Buffer[Employee]// getting from db

val employeeMap = employeeList.groupBy((p: Employee) => p.joiningdate)

val employeeDescSortedMap = new mutable.TreeMap[java.util.Date, 
mutable.Buffer[Employee]]()(Ordering.ordered[java.util.Date].reverse)

val limitedSizeEmployeeMap = new mutable.TreeMap[java.util.Date, mutable.Buffer[Employee]]()

var count: Long = 10

employeeDescSortedMap ++= employeeMap

    employeeDescSortedMap.foreach(employee => {
        if (count > 0) {
            limitedSizeEmployeeMap += employee
            count -= 1
        }
    })

limitedSizeEmployeeMap

1 Ответ

1 голос
/ 12 марта 2019

Если вы посмотрите в Scaladoc методы с именем, включающим sort, вы найдете sortBy. Единственная проблема заключается в том, как использовать его для сортировки по убыванию. Вы можете отменить по умолчанию Ordering:

val sorted = employeeList.sortBy(_.joiningdate)(Ordering[WhateverTheTypeOfJoiningDateIs].reverse)
sorted.take(10)

Или просто отсортировать по возрастанию и взять последние элементы:

val sorted = employeeList.sortBy(_.joiningdate)    
sorted.takeRight(10).reverse

Используйте то, что вы считаете более понятным.

Примечание sortBy не сортируется на месте (в соответствии с https://github.com/scala/collection-strawman/issues/25 Scala 2.13 должен был добавить методы для него, но я не вижу их в https://www.scala -lang.org /files/archive/nightly/2.13.x/api/2.13.x/scala/math/Ordering.html). Таким образом, toArray и сортировка по месту будут быстрее.

Существуют также алгоритмы для top-N, которые не требуют сортировки всей последовательности, но, насколько я знаю, их нет в стандартной библиотеке Scala или Java. Вы можете использовать Guava's Ordering или посмотреть Найти верхние N элементов в массиве для других опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...