Scala có phiên bản Rubys 'each_slice từ lớp Array không?Phiên bản Scala của each_slice của Rubys?
8
A
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)
và 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
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)
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. :-) :-) –
@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. –
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. –