Metode favorit pribadi saya adalah menggunakan pemesanan implisit yang disediakan untuk Tuple, karena jelas, ringkas, dan benar:
case class A(tag: String, load: Int) extends Ordered[A] {
// Required as of Scala 2.11 for reasons unknown - the companion to Ordered
// should already be in implicit scope
import scala.math.Ordered.orderingToOrdered
def compare(that: A): Int = (this.tag, this.load) compare (that.tag, that.load)
}
Ini bekerja karena pendamping untukOrdered mendefinisikan konversi implisit dari Ordering[T]ke Ordered[T]yang dalam lingkup untuk setiap kelas yang mengimplementasikan Ordered. Adanya implisit Orderings untuk Tuples memungkinkan konversi dari TupleN[...]menjadi Ordered[TupleN[...]]asalkan Ordering[TN]ada implisit untuk semua elemen T1, ..., TNtupel, yang seharusnya selalu menjadi kasus karena tidak masuk akal untuk mengurutkan pada tipe data dengan no Ordering.
Pengurutan implisit untuk Tuple adalah tujuan Anda untuk skenario pengurutan apa pun yang melibatkan kunci sortir komposit:
as.sortBy(a => (a.tag, a.load))
Karena jawaban ini telah terbukti populer, saya ingin memperluasnya, dengan memperhatikan bahwa solusi yang menyerupai berikut ini dalam beberapa keadaan dapat dianggap kelas perusahaan ™:
case class Employee(id: Int, firstName: String, lastName: String)
object Employee {
// Note that because `Ordering[A]` is not contravariant, the declaration
// must be type-parametrized in the event that you want the implicit
// ordering to apply to subclasses of `Employee`.
implicit def orderingByName[A <: Employee]: Ordering[A] =
Ordering.by(e => (e.lastName, e.firstName))
val orderingById: Ordering[Employee] = Ordering.by(e => e.id)
}
Diberikan es: SeqLike[Employee], es.sorted()akan mengurutkan berdasarkan nama, dan es.sorted(Employee.orderingById)akan mengurutkan berdasarkan id. Ini memiliki beberapa manfaat:
- Urutan ditentukan di satu lokasi sebagai artefak kode yang terlihat. Ini berguna jika Anda memiliki pengurutan yang rumit di banyak bidang.
- Sebagian besar fungsionalitas pengurutan yang diimplementasikan di pustaka scala beroperasi menggunakan instance
Ordering, jadi menyediakan pengurutan secara langsung menghilangkan konversi implisit dalam banyak kasus.