2011-08-18 21 views

cevap

2

Eşzamanlı dizi üzerinde toSeq çağrılarını yapan ve seqDerivedOrdering çağrıları yapan çok basit bir Ordering uygulayabilirsiniz. Bir Sıraya dönüştürme, performans açısından neredeyse ücretsiz olmalıdır. Eğer verimli olmasını istiyorsanız

8

, siz (bu bir boş değerlere kolları; hiçbir boş değerlere varsayabiliriz eğer, sadece uzun başka blok kullanın) kendi yazmak gerekecek: Aksi

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 
    } 
    } 
} 

, Bir WrappedArray'a paketlemek için .toSeq'u kullanabilir ve kendi taramanızı yapmak yerine Sıralı bir karşılaştırmayı erteleyebilirsiniz. (Bu sonuçta, boksu ve kutucuklarınızı açacaksınız, bu yüzden verimli değil. Baytlık boks, genellikle tüm baytların bir tablosunda arama yapılarak yapıldığı için, korkunç etkisizdir, bu yüzden bundan kurtulabilirsiniz. Eğer örneğin ağır ikili dosya işleme yapıyoruz sürece)

+0

Evet, böyle bir şey eklemek istedim, ama önce sormak istedim. Belki daha açık hale getirmek için stdlib'e bir şey eklemek mantıklı olabilir mi? – venechka

+0

@venechka - Array nesnesi bunları her tür için uygularsa iyi olur. Belki bir kişi bir geliştirme talebi sunmalıdır? Bu arada, standart kütüphanenin sahip olmadığı kullanışlı şeyler var. İhtiyacınız olan parçaları doldurmak için kendi kişisel kütüphanenize sahip olmalısınız! –

+0

bence tek bir özel versiyona sahip olmak yeterlidir. – venechka

7

ham performanstan ziyade kısalık içine iseniz.

scala> Ordering.by((_: Array[Byte]).toIterable) 
res0: scala.math.Ordering[Array[Byte]] = [email protected]