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 Ordering
s untuk Tuple
s memungkinkan konversi dari TupleN[...]
menjadi Ordered[TupleN[...]]
asalkan Ordering[TN]
ada implisit untuk semua elemen T1, ..., TN
tupel, 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.