Scala:如何按比例和顺序混合两个列表

Scala:如何按比例和顺序混合两个列表,scala,scala-collections,Scala,Scala Collections,我想定义这样一个函数: def mixUp[A](lista:List[A],aprop:Int,listb:List[A],bprop:Int):List[A] lista和listb是两个具有相同泛型的列表 和aprop,bprop表示出现的lista和listb的比例 假定 val lista = List("1", "2", "3") val listb = List("a", "b", "c", "d", "e", "f") 然后调用mixUp(lista,1,listb,2)的结

我想定义这样一个函数:
def mixUp[A](lista:List[A],aprop:Int,listb:List[A],bprop:Int):List[A]

lista
listb
是两个具有相同泛型的列表

aprop
bprop
表示出现的
lista
listb
的比例


假定

val lista = List("1", "2", "3")
val listb = List("a", "b", "c", "d", "e", "f")
然后调用
mixUp(lista,1,listb,2)
的结果应该是
列表(“1”、“a”、“b”、“2”、“c”、“d”、“3”、“e”、“f”)


如果

val lista = List("1", "2")
val listb = List("a", "b", "c", "d", "e")
混合的结果(lista,1,listb,2)
应该是
列表(“1”、“a”、“b”、“2”、“c”、“d”、“e”)


如果

混合的结果(lista,1,listb,2)
应该是
列表(“1”、“a”、“b”、“2”、“c”、“3”、“4”)

如何实现该功能

def mixUp[A]( lista: List[A]
            , aprop: Int
            , listb: List[A]
            , bprop: Int
            , acc: List[A] = List()
            ): List[A] = {
  if (lista.nonEmpty)
    mixUp(listb, bprop, lista.drop(aprop), aprop, acc ++ lista.take(aprop))
  else if (listb.nonEmpty)
    mixUp(listb.drop(bprop), bprop, lista, aprop, acc ++ listb.take(bprop))
  else acc
}
以适当的比例将元素添加到累加器中,直到元素用完为止

def mix[A](lista: List[A], aprop: Int, listb: List[A], bprop: Int): List[A] = 
  lista.grouped(aprop).zipAll(listb.grouped(bprop), List(), List()).flatMap(t => t._1 ++ t._2).toList
以适当的比例将元素添加到累加器中,直到元素用完为止

def mix[A](lista: List[A], aprop: Int, listb: List[A], bprop: Int): List[A] = 
  lista.grouped(aprop).zipAll(listb.grouped(bprop), List(), List()).flatMap(t => t._1 ++ t._2).toList
使用
grouped
size
拆分
列表,并使用
zipAll
将默认值设置为空
List()
以保持所有结果的大小相同,
flatMap
展平
映射并浓缩
元组

结果:

scala> mix(lista, 1, listb, 2)
res8: List[AnyVal] = List(1, a, b, 2, c, d, 3)

scala> mix(lista, 2, listb, 2)
res9: List[AnyVal] = List(1, 2, a, b, 3, c, d)

scala> mix(lista, 2, listb, 3)
res10: List[AnyVal] = List(1, 2, a, b, c, 3, d)
使用
grouped
size
拆分
列表,并使用
zipAll
将默认值设置为空
List()
以保持所有结果的大小相同,
flatMap
展平
映射并浓缩
元组

结果:

scala> mix(lista, 1, listb, 2)
res8: List[AnyVal] = List(1, a, b, 2, c, d, 3)

scala> mix(lista, 2, listb, 2)
res9: List[AnyVal] = List(1, 2, a, b, 3, c, d)

scala> mix(lista, 2, listb, 3)
res10: List[AnyVal] = List(1, 2, a, b, c, 3, d)