scala - 如何在多个字段上动态排序 scala 列表

标签 scala sorting dynamic collections

我有一个案例类

case class Employee(name: String, age: Int, joinedDate: Instant)

我有一份员工名单

val employees: List[Employee]

拥有多名员工。

我想根据多个字段对列表进行排序,例如,当多名员工具有相同的姓名时,应按年龄排序,类似地,当他们具有相同年龄时,应按 joinDate 排序,这意味着我需要多个级别的排序。排序参数可以按任何顺序。

scala中有一个sortBy方法,它可以对多列进行排序,即 employees.sortBy(e => (e.name, e.age))。但这是静态的,我需要动态。请注意,排序字段具有不同的数据类型,例如 Instant、Int 和 String。

这个可以实现吗?

最佳答案

您可以动态构建Ordering[Employee]。例如。 :

val orderings = Map(
  "name" -> Ordering.by[Employee](_.name),
  "age" -> Ordering.by[Employee](_.age),
  "joinedDate" -> Ordering.by[Employee](_.joinedDate)
)

def orderingByColumns(columns: Seq[String]) = columns.map(orderings).reduce(_.orElse(_))

您可以调用sorted来使用它并明确传递顺序:

employees.sorted(orderingByColumns(List("name", "age"))

将其扩展以处理降序列作为练习。

关于scala - 如何在多个字段上动态排序 scala 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59412699/

相关文章:

java - 在 Pivot 上对数组进行分区

java - 动态链接 : Class not visible to ClassLoader, 但我已经尝试过每一个?

scala - 如何通过提问方式和监督来处理异常

sorting - 更改 FullCalendar 月 View 上的默认事件排序顺序

python - 基于搜索查询的排序列表

时间:2019-03-17 标签:c#dynamicproxy

jquery 检测窗口大小调整

scala - 将 Option 中的值转换为另一种类型

scala - 使用 spark 读取压缩文件*带有自定义扩展名*

scala - 多节点 Spark 集群上的 Spark-shell 无法在远程工作节点上旋转执行器