在斯卡拉,是否可以压缩两个不同大小的列表?

问题描述:

例如,假设我有在斯卡拉,是否可以压缩两个不同大小的列表?

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

是否有可能产生一个列表

(('a',1), ('b',2), ('c',1),('d',2),('e',1)) 

你的字母和数字的元组,而不是名单。因此,我们进行了修复

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)) 

名单的短需要无限期地重复。在这种情况下,很显然,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)) 

你可以做一个简单的衬垫,使用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)) 

如果你不想重用任何列表数据的,但是你需要知道差距是什么来填充时间提前:

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

我怀疑这将有无限的列表或过程的流工作得很好...