2011-12-24 30 views

Trả lời

30

chữ và số của bạn là tuples, không danh sách. Vì vậy, hãy khắc phục điều đó

scala> val letters = List('a', 'b', 'c', 'd', 'e') 
letters: List[Char] = List(a, b, c, d, e) 

scala> val numbers = List(1,2)      
numbers: List[Int] = List(1, 2) 

Bây giờ, nếu chúng ta nén chúng ta không nhận được kết quả mong muốn

scala> letters zip numbers 
res11: List[(Char, Int)] = List((a,1), (b,2)) 

Nhưng điều đó cho thấy rằng nếu số được lặp lại vô hạn thì vấn đề sẽ được giải quyết

scala> letters zip (Stream continually numbers).flatten 
res12: List[(Char, Int)] = List((a,1), (b,2), (c,1), (d,2), (e,1)) 

Thật không may, điều đó dựa trên kiến ​​thức rằng các con số ngắn hơn chữ cái. Vì vậy, để sửa chữa tất cả lên

scala> ((Stream continually letters).flatten zip (Stream continually numbers).flatten take (letters.size max numbers.size)).toList 
res13: List[(Char, Int)] = List((a,1), (b,2), (c,1), (d,2), (e,1)) 
7

càng ngắn của danh sách cần phải được lặp đi lặp lại vô thời hạn. Trong trường hợp này rõ ràng là numbers là ngắn hơn, nhưng trong trường hợp bạn cần nó để làm việc nói chung, đây là cách bạn có thể làm điều đó:

def zipLongest[T](list1 : List[T], list2 : List[T]) : Seq[(T, T)] = 
    if (list1.size < list2.size) 
    Stream.continually(list1).flatten zip list2 
    else 
    list1 zip Stream.continually(list2).flatten 

val letters = List('a', 'b', 'c', 'd', 'e') 
val numbers = List(1, 2) 

println(zipLongest(letters, numbers)) 
1

Bạn có thể làm một cái lót đơn giản, sử dụng map phương pháp

val letters = List('a', 'b', 'c', 'd', 'e') 
val numbers = List(1, 2) 

val longZip1 = letters.zipWithIndex.map(x => (x._1, numbers(x._2 % numbers.length))) 

//or, using a for loop 
//for (x <- letters.zipWithIndex) yield (x._1, numbers(x._2 % numbers.size)) 
0

Nếu bạn không muốn sử dụng lại bất kỳ dữ liệu danh sách tuy nhiên bạn sẽ cần phải biết những gì các khoảng trống cần được lấp đầy với trước thời hạn:

val result = (0 to (Math.max(list1.size, list2.size) - 1)) map { index => 
(list1.lift(index).getOrElse(valWhen1Empty),list2.lift(index).getOrElse(valWhen2Empty)) 
} 

tôi nghi ngờ điều này sẽ làm việc tốt với danh sách vô hạn hoặc suối tất nhiên ...

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