在Scala中,是否可以压缩两个不同大小的列表?

del*_*ber 14 scala

例如,假设我有

val letters = ('a', 'b', 'c', 'd', 'e')
val numbers = (1, 2)
Run Code Online (Sandbox Code Playgroud)

是否可以生成一个列表

(('a',1), ('b',2), ('c',1),('d',2),('e',1))
Run Code Online (Sandbox Code Playgroud)

Jam*_*Iry 31

你的字母和数字是元组,而不是列表.所以让我们解决这个问题

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)
Run Code Online (Sandbox Code Playgroud)

现在,如果我们拉链它们,我们就无法得到理想的结果

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

但这表明,如果数字无限重复,那么问题就会得到解决

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

不幸的是,这是基于数字比字母短的知识.所以要解决这个问题

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))
Run Code Online (Sandbox Code Playgroud)


Pao*_*tti 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))
Run Code Online (Sandbox Code Playgroud)