2015-09-30 47 views
11

Son zamanlarda, herhangi bir öğeyi yeniden işlemeden önce n öğelerinden oluşan gruptaki koleksiyonları yinelemeye ihtiyaç duyduğumda, sürgülü (n, n) kullanarak kendimi buldum. Bu koleksiyonları gruplandırılmış (n) kullanarak yinelemenin daha doğru olup olmayacağını merak ediyordum. Sorum şu, bu özel durum için performans açısından bir ya da bir başkasını kullanmanın özel bir nedeni varsa. Eğer 'pencere' olan farklı bir uzunlukta olmasını istediğinizdeScala: sürgülü (N, N) ve gruplandırılmış (N)

val listToGroup = List(1,2,3,4,5,6,7,8) 
listToGroup: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8) 

listToGroup.sliding(3,3).toList 
res0: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8)) 

listToGroup.grouped(3).toList 
res1: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8)) 

cevap

7

nedeni yerine grouped ait sliding gerçekten geçerlidir kullanmak tarafından ne 'slayt' (yani sliding(m, n)m != n kullanarak, demek ki): som-snytt yorumunda işaret

listToGroup.sliding(2,3).toList 
//returns List(List(1, 2), List(4, 5), List(7, 8)) 

listToGroup.sliding(4,3).toList 
//returns List(List(1, 2, 3, 4), List(4, 5, 6, 7), List(7, 8)) 

olarak, her ikisi de yeni GroupedIterator returnining olarak Iterator içinde uygulanması sonucunda, herhangi bir performans farkı olacaksa olmayacak. Ancak, grouped(n)'u sliding(n, n)'dan yazmak daha basittir, bu nedenle kodunuz amaçlanan davranışta daha temiz ve daha açık olacaktır, bu yüzden grouped(n)'u öneririm.

numarası listesi göz önüne alındığında, uzunluğu herhangi alt liste büyük toplamını bulmak 4.

Şimdi: basitçe yeterli değil grouped bu örneği düşünün sliding kullanmak durumlara ilişkin bir örnek olarak

dinamik bir programlama yaklaşımı daha verimli bir sonuç üretebilir gerçeğini bir kenara koyarak, bu şekilde çözülebilir: buraya grouped kullanmak için olsaydı

def maxLengthFourSublist(list: List[Int]) = { 
    list.sliding(4,1).map(_.sum).max 
} 

, tüm sublists almak değildir, s sliding daha uygundur.

+3

Uygulama DRY'dir, bu nedenle performans için hangisini aradığınız önemli değildir. https://github.com/scala/scala/blob/v2.11.7/src/library/scala/collection/Iterator.scala#L1039 –

+0

@ som-snytt bilmek güzel! Bununla güncelleyeceğim! – childofsoong

İlgili konular