2014-07-11 13 views
5

Tôi có một mảng đơn giản của các bộLàm thế nào tôi có thể nhận được một khoản mảng của bản ghi trong scala

val arr = Array((1,2), (3,4),(5,6),(7,8),(9,10)) 

Tôi muốn để có được (1+3+5+7+9, 2+4+6+8+10) tuple là câu trả lời

gì là cách tốt nhất để có được tổng như các bộ dữ liệu, tương tự như các mảng thông thường. Tôi cố gắng

val res = arr.foldLeft(0,0)(_ + _) 

này không hoạt động.

Xin lỗi vì không viết ngữ cảnh. Tôi đã sử dụng nó trong scalding với algebird. Algebird cho phép tổng các bộ dữ liệu và tôi giả định rằng nó sẽ hoạt động. Đó là sai lầm của tôi.

+0

scalaz có này ... – dhg

Trả lời

5

Không có điều nào như số Tuple ngoài ra, do đó không thể hoạt động. Bạn sẽ phải hoạt động trên mỗi phối của Tuple:

val res = arr.foldLeft(0,0){ case (sum, next) => (sum._1 + next._1, sum._2 + next._2) } 

res: (Int, Int) = (25,30) 
2

này nên hoạt động độc đáo:

arr.foldLeft((0,0)){ case ((a0,b0),(a1,b1)) => (a0+a1,b0+b1) } 

Addition không được định nghĩa cho các bộ.

1

Sử dụng scalaz, trong đó xác định một tuple như một -nửa nhóm, cho phép bạn sử dụng toán tử append |+|

import scalaz._ 
import Scalaz._ 

arr.fold((0,0))(_ |+| _) 
0

Tuy nhiên, một sự thay thế

val (a, b) = arr.unzip 
         //> a : Array[Int] = Array(1, 3, 5, 7, 9) 
         //| b : Array[Int] = Array(2, 4, 6, 8, 10) 
(a.sum, b.sum)   
         //> res0: (Int, Int) = (25,30) 
+0

Cái này không phải là hiệu quả, nó sẽ đi qua bộ sưu tập tại ba lần (giải nén, và hai lần tổng). –

+0

Chính xác. Nó cũng hiển nhiên, điều mà tôi nghĩ cũng rất quan trọng. –

Các vấn đề liên quan