我有一个案例类
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/