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ığı Ordering
için s Tuple
s 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, ..., TN
hiç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.