Phương pháp yêu thích của cá nhân tôi là sử dụng thứ tự ngầm định được cung cấp cho Tuples, vì nó rõ ràng, ngắn gọn và chính xác:
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)
}
Này hoạt động bởi vì bạn đồng hành đểOrdered định nghĩa một chuyển đổi ngầm từ Ordering[T]để Ordered[T]mà là trong phạm vi cho bất kỳ lớp thực hiện Ordered. Sự tồn tại của các hàm ẩn Orderingcho Tuples cho phép chuyển đổi từ TupleN[...]thành với Ordered[TupleN[...]]điều kiện là Ordering[TN]tồn tại một cách ngầm định cho tất cả các phần tử T1, ..., TNcủa bộ tuple, điều này luôn đúng như vậy vì không có ý nghĩa gì khi sắp xếp theo kiểu dữ liệu không có Ordering.
Thứ tự ngầm cho Tuples là lựa chọn của bạn cho bất kỳ tình huống sắp xếp nào liên quan đến khóa sắp xếp tổng hợp:
as.sortBy(a => (a.tag, a.load))
Vì câu trả lời này đã được chứng minh là phổ biến, tôi muốn mở rộng nó, lưu ý rằng một giải pháp tương tự như sau trong một số trường hợp có thể được coi là cấp doanh nghiệp ™:
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)
}
Đã cho es: SeqLike[Employee], es.sorted()sẽ sắp xếp theo tên và es.sorted(Employee.orderingById)sẽ sắp xếp theo id. Điều này có một số lợi ích:
- Các loại được xác định ở một vị trí duy nhất dưới dạng các tạo tác mã hiển thị. Điều này rất hữu ích nếu bạn có những phân loại phức tạp trên nhiều lĩnh vực.
- Hầu hết chức năng sắp xếp được triển khai trong thư viện scala hoạt động bằng cách sử dụng các phiên bản của
Ordering, do đó, việc cung cấp một thứ tự trực tiếp loại bỏ chuyển đổi ngầm trong hầu hết các trường hợp.