Option 1: sortBy
Using the sortBy
method, this can be quite simple:
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) }
Option 2: Order Extension [Person]
Extending Ordered[Person]
, the class will know how to sort itself, so we get things like sorted
, min
and max
for free:
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
Option 3: Implicit ordering
If you use implicit Ordering
, you get sorted
, min
, etc. without reference to a specific order of your source class. This denouement may be convenient or annoying depending on your particular case.
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