У меня есть следующий класс Scala:
case class Person(firstName: String, lastName: String, age: Int)
extends Ordered[Person] {
def compare(that: Person): Int = {
if (this.lastName < that.lastName) -1
else if (this.lastName > that.lastName) 1
else if (this.firstName < that.firstName) -1
else if (this.firstName > that.firstName) 1
else this.age compare that.age
}
}
, чтобы разрешить сортировку по фамилии, имени и возрасту.
Как я могу написать это, используя сопоставление с образцом? Я придумал следующее, но есть ли лучший способ?
case class Person(firstName: String, lastName: String, age: Int)
extends Ordered[Person] {
def compare(that: Person): Int = {
that match {
case Person(_, thatLastName, _) if this.lastName < thatFile => -1
case Person(_, thatLastName, _) if this.lastName > thatFile => 1
case Person(thatFirstName, _, _) if this.firstName < thatFirstName => -1
case Person(thatFirstName, _, _) if this.firstName > thatFirstName => 1
case Person(_, _, thatAge) => this.age compare thatAge
}
}
}
ОБНОВЛЕНИЕ : изменено на Ordering[A]
согласно ответу Ландея:
implicit val personOrdering = new Ordering[Person] {
def compare(first: Person, second:Person): Int = {
second match {
case Person(_, thatLastName, _) if first.lastName < thatLastName => -1
case Person(_, thatLastName, _) if first.lastName > thatLastName => 1
case Person(thatFirstName, _, _) if first.firstName < thatFirstName => -1
case Person(thatFirstName, _, _) if first.firstName > thatFirstName => 1
case Person(_, _, thatAge) => first.age compare thatAge
}
}
}
case class Person(firstName: String, lastName: String, age: Int)
но кажется неловким, что я сопоставляю только second
. Как я могу сделать его более "элегантным"?