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 Ordering
cho Tuple
s 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, ..., TN
củ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.