2011-12-24 8 views

答えて

30

あなたの文字と数字は、リストタプルではありません。それでは、今

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) 

は、我々は彼らを圧縮あれば、我々は望ましい結果

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

を取得しないことを修正してみましょう。しかし、それは数字がその後、無限に繰り返された場合、問題が解決されるだろうことを示唆している

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

残念ながら、それは数字が文字よりも短いという知識に基づいています。だから、すべてを修正するまで

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

を生成することが可能です。このケースでは、numbersが短いことは明らかだが、場合にあなたはそれが一般的に作業する必要があり、ここにあなたがそれを行うことができる方法である。

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

あなたはしかし、あなたが知っておく必要がありますリストデータのいずれかを再利用したくない場合は、map方法

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

を使用して、簡単な1つのライナーを行うことができますどのようなギャップは、時間の先駆けで満たさなければならない。

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

私は、これは当然の無限リストまたはストリームでうまく動作しないだろう...

関連する問題