This question is probably quite dumb, but I can’t find an example and can’t figure it out.
I want to compare two Person classes by last, first, and middle name, in that order. Here’s the brain-dead way to do it:
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)
}
I know there’s some much more clever way to do this (probably using Ordering) but I can’t put my finger on it.
Todd
I figured out this once I realized how to access the right things in Ordering.
def compare(that: Person): Int = {
Ordering.Tuple3(Ordering.String, Ordering.String, Ordering.String).compare(
(lastName, firstName, middleName),
(that.lastName, that.firstName, that.middleName))
}
I’m pretty sure I can get away with fewer explicits, but this works and is reasonably compact.
Option 1: sortBy
Using the
sortBymethod, this can be pretty simple:Option 2: Extend Ordered[Person]
By extending
Ordered[Person], the class will know how to sort itself, so we get things likesorted,min, andmaxfor free:Option 3: Implicit Ordering
If you use an implicit
Ordering, then you getsorted,min, etc without having that particular ordering tied to your original class. This decoupling might be convenient, or it might by annoying, depending on your specific case.