这个问题可能很愚蠢,但我找不到一个例子,也无法弄明白.
我想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)
}
Run Code Online (Sandbox Code Playgroud)
我知道有一些更聪明的方法(可能使用Ordering
),但我不能把手指放在上面.
托德
一旦我意识到如何在订购中访问正确的东西,我就想出了这一点.
def compare(that: Person): Int = {
Ordering.Tuple3(Ordering.String, Ordering.String, Ordering.String).compare(
(lastName, firstName, middleName),
(that.lastName, that.firstName, that.middleName))
}
Run Code Online (Sandbox Code Playgroud)
我很确定我能用更少的语言来逃避,但这种方法很有效,并且相当紧凑.
dhg*_*dhg 18
使用该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) }
Run Code Online (Sandbox Code Playgroud)
通过扩展Ordered[Person]
,类会知道如何自行解决,所以我们得到的东西一样sorted
,min
和max
免费:
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
Run Code Online (Sandbox Code Playgroud)
如果您使用隐式Ordering
,那么您得到sorted
,min
等等,而不必将该特定顺序绑定到您的原始类.这种解耦可能很方便,或者可能会烦人,具体取决于您的具体情况.
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
Run Code Online (Sandbox Code Playgroud)
如果您使用 scala 2.13+,您可以使用Ordering.by
和orElseBy
。这是相当明确的。
case class Person(first: String, middle: String, last: String)
implicit val ordering: Ordering[Person] = Ordering.by[Person, String](_.first)
.orElseBy(_.middle)
.orElseBy(_.last)
val list = List(Person("john", "a", "smith"), Person("steve", "x", "scott"), Person("bill", "w", "smith"))
list.sorted
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3881 次 |
最近记录: |