Benim kişisel favori yöntemim, açık, özlü ve doğru olduğu için Tuples için sağlanan örtük sıralamayı kullanmaktır:
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)
}
Bunun nedeni çalışır için arkadaşıOrdered bir örtük dönüştürme gelen tanımlayıp Ordering[T]için Ordered[T]hangi uygulayan herhangi bir sınıf için kapsam içindedir Ordered. Örtük varlığı Orderingiçin s Tuples bir dönüşüm sağlar TupleN[...]için Ordered[TupleN[...]]bir örtük sağlanan Ordering[TN]tüm unsurları için var T1, ..., TNhiçbir bir veri türüne tür hiçbir mantıklı nedeni her zaman böyle olması gerektiğini başlığın, Ordering.
Tuples için örtük sıralama, bir bileşik sıralama anahtarı içeren herhangi bir sıralama senaryosu için gitmeniz gereken yerdir:
as.sortBy(a => (a.tag, a.load))
Bu yanıtın popüler olduğu kanıtlandığı için, aşağıdakilere benzer bir çözümün bazı durumlarda kurumsal sınıf ™ olarak kabul edilebileceğini belirterek, konuyu genişletmek istiyorum:
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)
}
Verilen es: SeqLike[Employee], es.sorted()ada es.sorted(Employee.orderingById)göre sıralar ve kimliğe göre sıralar. Bunun birkaç faydası vardır:
- Sıralar, görünür kod yapıları olarak tek bir konumda tanımlanır. Bu, birçok alanda karmaşık sıralamalarınız varsa kullanışlıdır.
- Scala kitaplığında uygulanan çoğu sıralama işlevi
Ordering, örneklerini kullanarak çalışır , bu nedenle bir sıralama sağlamak çoğu durumda örtük bir dönüşümü doğrudan ortadan kaldırır.