gpt4 book ai didi

java - 对自定义类 arraybuffer 进行排序并获取 scala 中的子集

转载 作者:行者123 更新时间:2023-12-02 10:09:09 25 4
gpt4 key购买 nike

我有一个自定义对象 Employee 的数组缓冲区,其中包含 empname、empno、joiningdate

我想在 joindate 上按 desc 顺序对 ArrayBuffer 进行排序并获得前 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

最佳答案

如果您在 Scaladoc 中查找名称包含 sort 的方法,您会发现 sortBy 。唯一的问题是如何使用它进行降序排序。您可以反转默认的排序:

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或参见Find top N elements in an Array对于其他选项。

关于java - 对自定义类 arraybuffer 进行排序并获取 scala 中的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55117910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com