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

时间:2016-12-06 07:05:19

标签: scala scala-collections

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

listalistb是两个具有相同通用名称的列表。

apropbprop表示出现listalistb的比例。

假设

val lista = List("1", "2", "3")
val listb = List("a", "b", "c", "d", "e", "f")

然后调用mixUp(lista, 1, listb, 2)的结果应为
List("1", "a", "b", "2", "c", "d", "3", "e", "f")

如果

val lista = List("1", "2")
val listb = List("a", "b", "c", "d", "e")

mixUp(lista, 1, listb, 2)的结果应为
List("1", "a", "b", "2", "c", "d", "e")

如果

val lista = List("1", "2", "3", "4")
val listb = List("a", "b", "c")

mixUp(lista, 1, listb, 2)的结果应为
List("1", "a", "b", "2", "c", "3", "4")

如何实现这个功能?

2 个答案:

答案 0 :(得分:4)

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

使用groupedList分割为size,将zipAll分隔为默认的空List(),以保持所有结果的大小相同,{{1} } flatMap映射并连接flatten

<强>结果:

tuple

答案 1 :(得分:1)

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
}

以适当的比例向累加器添加元素,直到元素用完为止。