2012-04-14 25 views
7

Tôi đang cố gắng trao đổi mọi cặp giá trị trong mảng của tôi bằng cách sử dụng cho và lợi nhuận và cho đến nay tôi rất không thành công. Những gì tôi đã cố gắng thực hiện như sau:Trao đổi các giá trị mảng với và cho ra scala

val a = Array(1,2,3,4,5) //What I want is Array(2,1,4,3,5) 

for(i<-0 until (a.length-1,2),r<- Array(i+1,i)) yield r 

Đoạn đưa ra ở trên trả về 2,1,4,3 vector (và 5 được bỏ qua)

Ai đó có thể chỉ ra những gì tôi đang làm sai ở đây và làm thế nào để có được sự đảo ngược chính xác bằng cách sử dụng và sản lượng?

Cảm ơn

+7

Đây là từ "Scala for the impatient". Bài tập 3.2 – Zotov

Trả lời

11

Nó sẽ dễ dàng hơn nếu bạn sử dụng didin't for/yield:

a.grouped(2) 
    .flatMap{ 
    case Array(x,y) => Array(y,x) 
    case Array(x) => Array(x) 
    }.toArray // Array(2, 1, 4, 3, 5) 
+2

Đây có lẽ là cách thức trưởng thành để làm việc. Tôi đang học scala và đã tự hỏi nếu như vậy có thể được thực hiện bằng cách sử dụng cho/năng suất. –

+0

@sc_ray, Việc xây dựng 'cho/lợi nhuận 'làm cho mọi thứ đẹp hơn rất nhiều thời gian, nhưng đây không phải là một kết hợp tuyệt vời cho nó. – dhg

35
a.grouped(2).flatMap(_.reverse).toArray 

hoặc nếu bạn cần cho/lượng (ít hơn nhiều súc tích trong trường hợp này, và trong thực tế nở vào cùng một mã):

(for {b <- a.grouped(2); c <- b.reverse} yield c).toArray 
+0

Tôi thích sử dụng 'đảo ngược'. Tốt đẹp. – dhg

+0

Bài tập nói một vòng lặp, sau đó thực hiện cho/yield, không phải là một giải pháp chức năng. Mặc dù vậy ... – Rob

8

Tôi không biết liệu OP có đang đọc Scal a cho thiếu kiên nhẫn, nhưng đây là bài tập 3.3.

Tôi thích giải pháp bản đồ, nhưng chúng tôi chưa có trong chương đó, vì vậy đây là triển khai xấu xí của tôi bằng cách sử dụng yêu cầu cho/lợi nhuận. Bạn có thể có thể di chuyển một số logic năng suất vào một bảo vệ/định nghĩa.

for(i <- 0 until(a.length,2); j <- (i+1).to(i,-1) if(j<a.length)) yield a(j) 

Tôi là một anh chàng Java, vì vậy tôi không xác nhận xác nhận này, nhưng tôi tò mò về chi phí của bản đồ/nhóm và lặp là gì. Tôi nghi ngờ nó tất cả biên dịch xuống cùng một mã byte Java.

+0

Rất tuyệt. Điều này có vẻ là tinh thần của bài tập. –

+0

Câu trả lời hay cho câu hỏi được hỏi. –

0

Một đơn giản, cho năng suất giải pháp:

def swapAdjacent(array: ArrayBuffer[Int]) = { 
    for (i <- 0 until array.length) yield (
     if (i % 2 == 0) 
      if (i == array.length - 1) array(i) else array(i + 1) 
     else array(i - 1) 
    ) 
} 
0

Nếu bạn đang làm bài tập 3.2 và 3.3 trong Scala cho Nóng lòng chờ đợi ở đây là cả hai câu trả lời của tôi. Chúng giống với logic di chuyển xung quanh.

/** Excercise 3.2 */ 
for (i <- 0 until a.length if i % 2 == 1) {val t = a(i); a(i) = a(i-1); a(i-1) = t } 
/** Excercise 3.3 */ 
for (i <- 0 until a.length) yield { if (i % 2 == 1) a(i-1) else if (i+1 <= a.length-1) a(i+1) else a(i) } 
0

Tôi có giải pháp của tôi, nhưng không có năng suất. Có thể ai đó sẽ thấy nó hữu ích.

def swap(x: Array[Int]): Array[Int] = { 
    for (i <- 0 until x.length-1 by 2){ 
     var left = x(i) 
     x(i) = x(i+1) 
     x(i+1) = left 
    } 
    x 
    } 
Các vấn đề liên quan