Cách dễ nhất là xác định Thứ tự ngầm định [T] trên chúng, nhưng sau đó bạn phải chuyển thứ tự này tới hàm sắp xếp (hoặc bất kỳ hàm nào khác muốn so sánh chúng). Nó cũng có thể vượt qua nó hoàn toàn.
Một cách khác sẽ được, để mở rộng các lớp tuple bởi các nhà điều hành < thông qua một diễn viên tiềm ẩn:
implicit def compareTuple[T](lhs: (T,T)) = new {
def <(rhs: (T,T)) = lhs._1<rhs._1 || (lhs._1==rhs._1 && lhs._2<rhs._2)
}
chỉnh sửa: Nếu bạn muốn có những toán tử so sánh khác nữa, bạn có thể nhận được chúng bởi kế thừa từ Ordered [T]:
implicit def compareTuple[T](lhs: (T,T)) = new Ordered[(T,T)] {
def compare(rhs: (T,T)) = ...
}
edit2: Nếu bạn cũng cần phải so sánh các tuple các kích thước khác nhau, bạn có thể sử dụng hàm productIterator được định nghĩa trong tất cả các lớp tuple (see documentation) và cho phép bạn có được một trình lặp trên bộ tuple. Bằng cách này bạn có thể viết một hàm giống như bạn sẽ làm nó với một danh sách.
EDIT3: Đây sẽ là một cái gì đó như:
implicit def compareTuple[T <: Product](lhs: T) = new Ordered[T] {
def compare[U <: Product](rhs: U) = {
def compare(lhs: Any, rhs: Any) = ...
def iteratorCompare(lhs: Iterator[Any], rhs: Iterator[Any]):Int =
if(!lhs.hasNext)
if(!rhs.hasNext)
0
else
-1
else if(!rhs.hasNext)
1
else
compare(lhs.next,rhs.next)
iteratorCompare(lhs.productIterator,rhs.productIterator)
}
}
Nhưng với phương pháp này bạn phải chăm sóc về các loại. Bởi vì hàm không biết các kiểu phần tử tuple (chúng có thể khác nhau bên trong cùng một bộ), nó chỉ có thể cung cấp cho bạn một Iterator [Any]. Vì vậy, bạn phải xác định một so sánh (Bất kỳ, Bất kỳ) chức năng để xử lý những gì bạn muốn.
Điểm tốt, Daniel. Tôi đã chỉnh sửa câu hỏi của tôi để nhà nước so sánh tuples luôn luôn có cùng một arity. Đối với các loại không được đặt hàng, các bộ dữ liệu của tôi phải có các ký hiệu (đó là lý do tôi chuyển sang các bộ dữ liệu thay vì danh sách), nhưng vì tôi không tìm thấy bất kỳ cách nào để đặt các biểu tượng, thay vào đó, tôi sử dụng các số. Tôi có nên sử dụng danh sách không? Nếu tôi thực sự cần thêm biểu tượng vào danh sách thì sao? – lasaro
@lasaro Vâng, bây giờ bạn đã đơn giản hóa vấn đề, có một giải pháp tương đối dễ dàng. Xem câu trả lời đã chỉnh sửa. –
Cảm ơn Daniel, cho bạn ví dụ rất ngắn gọn. – lasaro