개인적으로 가장 좋아하는 방법은 명확하고 간결하며 정확하기 때문에 Tuples에 대해 제공된 암시 적 순서를 사용하는 것입니다.
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별로 정렬합니다. 다음과 같은 몇 가지 이점이 있습니다.
- 정렬은 단일 위치에서 표시되는 코드 아티팩트로 정의됩니다. 여러 필드에 대해 복잡한 정렬이있는 경우 유용합니다.
- 스칼라 라이브러리에 구현 된 대부분의 정렬 기능은의 인스턴스를 사용하여 작동
Ordering
하므로 정렬을 제공하면 대부분의 경우 암시 적 변환이 직접 제거됩니다.