gpt4 book ai didi

Scala 按多个字段排序

转载 作者:行者123 更新时间:2023-12-03 04:39:42 24 4
gpt4 key购买 nike

这个问题可能很愚蠢,但我找不到例子,也无法弄清楚。

我想按姓氏、名字和中间名的顺序比较两个 Person 类。这是一种脑死亡的方法:

def compare(that: Person): Int = {
val last: Int = lastName.compare(that.lastName)
if (last != 0) last
else {
val first: Int = firstName.compare(that.firstName)
if (first != 0) first
else middleName.compare(that.middleName)
}

我知道有一些更聪明的方法可以做到这一点(可能使用Ordering),但我无法具体说明。

托德

一旦我意识到如何在订购中访问正确的内容,我就明白了这一点。

def compare(that: Person): Int = {
Ordering.Tuple3(Ordering.String, Ordering.String, Ordering.String).compare(
(lastName, firstName, middleName),
(that.lastName, that.firstName, that.middleName))
}

我很确定我可以使用更少的显式内容,但这很有效并且相当紧凑。

最佳答案

选项 1:排序

使用 sortBy 方法,这可以非常简单:

case class Person(first: String, middle: String, last: String)
val personList = List(Person("john", "a", "smith"), Person("steve", "x", "scott"), Person("bill", "w", "smith"))
personList.sortBy{ case Person(f,m,l) => (l,f,m) }

选项 2:延长订购[人]

通过扩展 Ordered[Person],该类将知道如何对自身进行排序,因此我们得到诸如 sortedmin最大免费:

case class Person(first: String, middle: String, last: String) extends Ordered[Person] {
def compare(that: Person): Int =
(last compare that.last) match {
case 0 =>
(first compare that.first) match {
case 0 => middle compare that.middle
case c => c
}
case c => c
}
}

val personList = List(Person("john", "a", "smith"), Person("steve", "x", "scott"), Person("bill", "w", "smith"))
personList.sorted
personList.min
personList.max

选项 3:隐式排序

如果您使用隐式Ordering,那么您将获得sortedmin等,而无需将该特定顺序与原始类绑定(bind)。这种解耦可能很方便,也可能很烦人,具体取决于您的具体情况。

case class Person(first: String, middle: String, last: String)

implicit val ord = new Ordering[Person] {
def compare(self: Person, that: Person): Int =
(self.last compare that.last) match {
case 0 =>
(self.first compare that.first) match {
case 0 => self.middle compare that.middle
case c => c
}
case c => c
}
}

val personList = List(Person("john", "a", "smith"), Person("steve", "x", "scott"), Person("bill", "w", "smith"))
personList.sorted
personList.min
personList.max

关于Scala 按多个字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10602730/

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