gpt4 book ai didi

Scala sortBy参数作为序列

转载 作者:行者123 更新时间:2023-12-04 04:45:35 25 4
gpt4 key购买 nike

我定义了一个

case class User(var firstName: String, var lastName: String, var city: String, var price: Int)

并想要排序
val users = List(
User("Peter", "Fox", "Berlin", 30),
User("Otto", "Schmidt", "Berlin", 20),
User("Carl", "Schmidt", "Berlin", 30),
User("Igor", "Schmidt", "Berlin", 10),
User("Hugo", "Schmidt", "Berlin", 50))

我可以做到这一点,例如由
val sorted = users.sortBy(p => (p.lastName,p.firstName))

是否可以通过这样的序列给 sortBy 排序标准?
val sortCriteria = Seq(lastname,firstname)
val sorted = test.sortBy(p => sortCriteria)

我想根据用户请求将序列中的标准与 1 到 n 个参数组合在一起,而不定义所有可能的组合。

最佳答案

您需要的是一种比较两个 User 的方法s。逻辑是:在第一个标准上进行比较,如果是 1 或 -1,那就是结果,如果是 0,则在下一个标准上进行比较。

我们有一点问题,因为只是提供了 Seq[User => Any] ,我们无法说服编译器 Any将有一个明确的顺序。那么如何定义一个类,它会记住如何比较实例而不必记住它正在比较的字段的类型:

case class Criterion[T](crit: User => T)(implicit ord: Ordering[T]) {
def compare(x: User, y: User): Int = ord.compare(crit(x), crit(y))
}

然后我们只需要实现顺序比较:
def ord(criteria: Seq[Criterion[_]]) = new Ordering[User] {
def compare(x: User, y: User) = {
def loop(crits: Seq[Criterion[_]]): Int = crits match {
case Seq() => 0
case c +: cs => c.compare(x, y) match {
case 0 => loop(cs)
case i => i
}
}
loop(criteria)
}
}

我们现在可以用上面的数据试试这个
val cs = Seq(Criterion(_.price), Criterion(_.firstName))
val sorted = users.sorted(ord(cs))

/* results:
sorted: List[User] = List(
User(Igor,Schmidt,Berlin,10), Sorted by Price
User(Otto,Schmidt,Berlin,20),
User(Carl,Schmidt,Berlin,30),
User(Peter,Fox,Berlin,30), <-- Peter now after Carl
User(Hugo,Schmidt,Berlin,50)) */

关于Scala sortBy参数作为序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18234357/

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