2010-03-16 5 views

Trả lời

12

Scala 2.8 có grouped rằng sẽ đoạn dữ liệu trong khối kích thước n (mà có thể được sử dụng để đạt each_slice chức năng):

scala> val a = Array(1,2,3,4,5,6) 
a: Array[Int] = Array(1, 2, 3, 4, 5, 6) 

scala> a.grouped(2).foreach(i => println(i.reduceLeft(_ + _))) 
3 
7 
11 

Không có bất cứ điều gì mà sẽ làm việc ra khỏi hộp trong 2,7 .x như xa như tôi nhớ, nhưng nó khá dễ dàng để xây dựng lên từ take(n)drop(n) từ RandomAccessSeq:

def foreach_slice[A](s: RandomAccessSeq[A], n: Int)(f:RandomAccessSeq[A]=>Unit) { 
    if (s.length <= n) f(s) 
    else { 
    f(s.take(n)) 
    foreach_slice(s.drop(n),n)(f) 
    } 
} 

scala> val a = Array(1,2,3,4,5,6) 
a: Array[Int] = Array(1, 2, 3, 4, 5, 6) 

scala> foreach_slice(a,2)(i => println(i.reduceLeft(_ + _)))     
3 
7 
11 
+0

Sẽ tốt hơn nếu tạo lớp trình bao bọc 'Array', sử dụng bản gốc' Mảng' làm phần cuối trong khi hiện tại chỉ là một phần của nó. Một phương thức 'eachSlice' ngầm định có thể được thêm vào' Array', trả về một 'List [ArraySlice]'. Bạn không muốn có một đi vào nó trong câu trả lời của bạn? :-) Tôi không thể cho bạn nhiều phiếu bầu hơn, nhưng tôi rất ngưỡng mộ bạn. :-) :-) –

+0

@Daniel: Hahaha - vâng thì tốt hơn (nhanh hơn), nhưng nếu nó không ở trong thư viện đâu đó (và tại sao chúng ta lại có 'grouped' trong 2,8?), Tôi nghĩ Tôi sẽ để nó như một bài tập cho người đọc. –

+0

Nó sẽ hoạt động tốt hơn cho các thuật toán tại chỗ. Bạn luôn có thể gửi nó để nâng cao Scala. Tuy nhiên, tốt hơn hãy đăng ký biểu mẫu đóng góp. Tôi muốn thấy một tùy chọn như vậy. –

6

Thử nghiệm với Scala 2.8:

scala> (1 to 10).grouped(3).foreach(println(_)) 
IndexedSeq(1, 2, 3) 
IndexedSeq(4, 5, 6) 
IndexedSeq(7, 8, 9) 
IndexedSeq(10)