2009-07-16 28 views

Trả lời

21

Nó không rõ ràng những gì bạn đang yêu cầu - những gì bạn mong đợi các ngữ nghĩa của nhiều sản lượng được. Tuy nhiên, có một điều là bạn có thể không bao giờ muốn sử dụng các chỉ mục để điều hướng một danh sách - mỗi cuộc gọi đến t (i) là O (i) để thực hiện.

Vì vậy, đây là một khả năng mà bạn có thể được yêu cầu cho

scala> val l = List(1,2,3); val t = List(-1,-2,-3) 
l: List[Int] = List(1, 2, 3) 
t: List[Int] = List(-1, -2, -3) 

scala> val pairs = l zip t 
pairs: List[(Int, Int)] = List((1,-1), (2,-2), (3,-3)) 

Và đây là một khả năng mà bạn có thể được yêu cầu cho

scala> val crossProduct = for (x <- l; y <- t) yield (x,y) 
crossProduct: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3)) 

Các sau là đường chỉ là cú pháp cho

scala> val crossProduct2 = l flatMap {x => t map {y => (x,y)}} 
crossProduct2: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3)) 

Khả năng thứ ba là bạn muốn xen kẽ chúng

scala> val interleaved = for ((x,y) <- l zip t; r <- List(x,y)) yield r 
interleaved: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10) 

Đó là đường cú pháp cho

scala> val interleaved2 = l zip t flatMap {case (x,y) => List(x,y)} 
interleaved2: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10) 
+0

Tôi nghĩ anh ta chỉ muốn nội suy các danh sách. –

+0

đúng, tôi muốn xen kẽ chúng, vì vậy cả hai đều cho kết quả tương tự: [James] val xen kẽ = cho ((x, y) <- l zip t; r <- Danh sách (x, y)) mang lại r [Daniel] for (i <- 0-10; r <- Danh sách (l (i), t (i))) năng suất r tôi nghĩ rằng James' một là thanh lịch hơn và nó cũng kết quả đầu ra Danh sách . Cảm ơn rất nhiều bạn. –

0

Dường như không. Tôi nhận được một lỗi biên dịch khi tôi thử nó.

Dường như đối với .. yield là biểu thức. Bạn không thể có hai sản lượng, vì đó không thực sự là một phần của biểu thức.

Nếu bạn muốn mang lại nhiều giá trị, tại sao không mang lại chúng dưới dạng bộ hoặc danh sách?

Ví dụ:

for(t <- List(1,2,3); l <- List(-1,-2,-3)) 
    yield (t, l) 
0

lẽ năng suất không phải là cách tốt nhất để đi đâu? Có lẽ việc thêm mảng đơn giản có thể được sử dụng ở đây.

+0

Không có sự khác biệt ngữ nghĩa giữa việc sử dụng lợi nhuận và sử dụng danh sách. Sự khác biệt thực tế liên quan đến việc sử dụng bộ nhớ, trong đó hiệu suất là hiệu quả hơn cho các bộ lớn. – Christopher

5

Không, bạn không thể sử dụng nhiều mệnh đề lợi nhuận, nhưng có xung quanh công việc. Ví dụ:

for (i <- 0 to 10; 
    r <- List(l(i), t(i))) 
yield r 

Bạn có thể lồng ghép để hiểu, nhưng điều này sẽ dẫn đến danh sách các yếu tố mà tôi không tin là những gì bạn muốn.

+1

Cảnh báo, giải pháp này là O (n^2) –

+0

Đối với các danh sách l & t, đó là, tôi sẽ thừa nhận, ví dụ của ông. Nếu t & l là mảng hoặc chức năng, điều đó không đúng, đúng không? –

+0

Quyền, đối với mảng được lập chỉ mục truy cập là O (1) do đó giải pháp sẽ là O (n). –

1

Dưới đây là một giải pháp loại-agnostic cho một người vô danh, thay đổi số lượng của các nguyên tố trong một số không rõ danh sách:

def xproduct (xx: List [List[_]]) : List [List[_]] = 
    xx match { 
    case aa :: bb :: Nil => 
     aa.map (a => bb.map (b => List (a, b))).flatten  
    case aa :: bb :: cc => 
     xproduct (bb :: cc).map (li => aa.map (a => a :: li)).flatten 
    case _ => xx 
} 

Đối với 2 Lists nó được overengineered. Bạn có thể gọi số điện thoại này là

xproduct (List (l, t)) 
2

Sản lượng có thể được lồng nhau, điều này sẽ dẫn đến ...

for (i <- 0 to 3) yield { 
    for (j <- 0 to 2) yield (i,j) 
} 

trong một Vector Vector:

scala.collection.immutable.IndexedSeq[scala.collection.immutable.IndexedSeq[(Int, Int)]] 
= Vector(Vector((0,0), (0,1), (0,2)), Vector((1,0), (1,1), (1,2)), Vector((2,0), (2,1), (2,2)), Vector((3,0), (3,1), (3,2))) 

for (i <- 0 to 3; 
    j <- 0 to 2) yield (i,j) 

Giải pháp san phẳng là ngữ nghĩa khác nhau. Câu hỏi

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