2011-08-18 46 views
6

Có cần thiết phải cung cấp việc triển khai từ đầu không? Tôi không thể tìm thấy bất kỳ ngụ ý nào phù hợp, thậm chí không phải ở đặc điểm cuối cùng của Implicits. seqDerivedOrdering rõ ràng là không làm việc, kể từ Array không phải là một Seq.Cách xác định Thứ tự [Array [Byte]]?

Trả lời

2

Bạn có thể triển khai Ordering rất đơn giản gọi toSeq trên mảng comapred và gọi số seqDerivedOrdering. Việc chuyển đổi sang một Seq sẽ gần như miễn phí về mặt biểu diễn.

8

Nếu bạn muốn nó được hiệu quả, bạn sẽ phải viết riêng của bạn (cái này xử lý null, nếu bạn có thể giả định không null, chỉ cần sử dụng các khối khác dài):

val o = new math.Ordering[Array[Byte]] { 
    def compare(a: Array[Byte], b: Array[Byte]): Int = { 
    if (a eq null) { 
     if (b eq null) 0 
     else -1 
    } 
    else if (b eq null) 1 
    else { 
     val L = math.min(a.length, b.length) 
     var i = 0 
     while (i < L) { 
     if (a(i) < b(i)) return -1 
     else if (b(i) < a(i)) return 1 
     i += 1 
     } 
     if (L < b.length) -1 
     else if (L < a.length) 1 
     else 0 
    } 
    } 
} 

Nếu không, bạn có thể .toSeq để đóng gói thành một WrappedArray và trì hoãn đến một Seq so sánh thay vì làm quét của riêng bạn. (Điều này sẽ kết thúc boxing và unboxing byte của bạn, đó là lý do tại sao nó không hiệu quả. Kể từ byte đấm bốc thường thực hiện bằng cách tra cứu trong một bảng của tất cả các byte, nó không phải khủng khiếp inefficent, vì vậy bạn có thể nhận được ngay với nó trừ khi bạn đang làm ví dụ nặng xử lý tập tin nhị phân)

+0

Vâng, tôi muốn thêm một cái gì đó như thế này, nhưng muốn hỏi trước đó. Có lẽ nó có ý nghĩa để thêm một cái gì đó để stdlib để làm cho nó rõ ràng hơn? – venechka

+0

@venechka - Sẽ tốt hơn nếu đối tượng 'Array' triển khai các đối tượng này cho từng loại. Có lẽ ai đó nên gửi yêu cầu nâng cao? Trong khi chờ đợi, mặc dù, có _lots_ những thứ tiện dụng mà thư viện chuẩn không có. Bạn nên quen với việc có thư viện chuẩn cá nhân của riêng bạn để điền vào những phần mà bạn cần! –

+0

nó là đủ để có một phiên bản @specialized duy nhất tôi nghĩ. – venechka

7

Nếu bạn đang vào ngắn gọn hơn là hiệu suất thô:.

scala> Ordering.by((_: Array[Byte]).toIterable) 
res0: scala.math.Ordering[Array[Byte]] = [email protected] 
Các vấn đề liên quan