私の個人的なお気に入りの方法は、タプルに提供されている暗黙の順序を利用することです。これは、明確で簡潔で正しいためです。
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)
}
これは、動作するためにコンパニオンOrdered
から定義暗黙の変換Ordering[T]
にOrdered[T]
どれが実装任意のクラスの範囲内にありますOrdered
。Ordering
s の暗黙のs の存在により、タプルのすべての要素に暗黙の存在が提供されるTuple
からTupleN[...]
への変換が可能になります。Ordered[TupleN[...]]
Ordering[TN]
T1, ..., TN
Ordering
タプルの暗黙的な順序付けは、複合ソートキーが関係するすべてのソートシナリオに最適です。
as.sortBy(a => (a.tag, a.load))
この回答が人気を博していることを証明したので、私はそれについてさらに詳しく説明したいと思います。次のようなソリューションは、状況によってはエンタープライズグレード™と見なされる可能性があることに注意してください。
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)
}
を指定するとes: SeqLike[Employee]
、es.sorted()
名前でes.sorted(Employee.orderingById)
ソートされ、IDでソートされます。これにはいくつかの利点があります。
- ソートは、可視コードアーティファクトとして1つの場所で定義されます。これは、多くのフィールドで複雑なソートがある場合に役立ちます。
- scalaライブラリに実装されているほとんどの並べ替え機能はのインスタンスを使用して動作する
Ordering
ため、順序付けを提供すると、ほとんどの場合、暗黙的な変換が直接排除されます。