Scala:如何按比例和顺序混合两个列表
Scala: How to mix up two List in proportion and in order
我想定义这样一个函数:
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)
的结果应该是
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")
如何实现功能?
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
使用grouped
将List
拆分为size
,zipAll
默认为空List()
以保持所有结果大小相同,flatMap
到 flatten
映射并连接 tuple
.
结果:
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)
我想定义这样一个函数:
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)
的结果应该是
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")
如何实现功能?
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
使用grouped
将List
拆分为size
,zipAll
默认为空List()
以保持所有结果大小相同,flatMap
到 flatten
映射并连接 tuple
.
结果:
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)