我有两个序列,第一个序列较大或与第二个序列大小相同。
例如val first = 1 to 7
和val second = Seq(3, 5)
。我想生成一个如下所示的序列:
first |second| result
1 | | 3
2 | | 3
3 | 3 | 3
4 | | 3
5 | 5 | 5
6 | | 5
7 | | 5
第二个例子:
val first = 1 to 7
val second = Seq(3, 5, 6)
result will be Seq(3, 3, 3, 3, 5, 6, 6)
我正在寻找一般解决方案。
答案 0 :(得分:2)
相当直接的oneliner解决方案。创建第二个列表的第一个元素的序列,第二个列表的所有元素小于第一个列表的当前映射元素,并获取该序列的最大元素。
val first = 1 to 7
val second = List(3, 5, 6)
val result = (first.map(x => (second.head +: second.filter(_ <= x)).last))
答案 1 :(得分:1)
简单方法:
scala> val first = 1 to 7 toList
first: List[Int] = List(1, 2, 3, 4, 5, 6, 7)
scala> val second = List(3,5)
second: List[Int] = List(3, 5)
scala> val result = first.map(x => if(x < second.tail.head) second.head else second.tail.head)
result: List[Int] = List(3, 3, 3, 3, 5, 5, 5)
然而,这不是很灵活,但它满足了你的问题。
答案 2 :(得分:1)
我自己找到了解决方案。给出问题中的序列
go build -ldflags "-X main.YOUR_VARIABLE=$your_variable" main.go
提供正确的结果
答案 3 :(得分:1)
使用span
@annotation.tailrec
def recurse(first: Seq[Int], second: Seq[Int], acc: Seq[Int] = List.empty): Seq[Int] = {
second match {
case a :: b :: tail =>
val (f1, f2) = first.span(_ != b)
recurse(f2, b :: tail, List.fill(f1.length)(a) ++ acc)
case a :: Nil =>
(List.fill(first.length)(a) ++ acc).reverse
}
}
val first = 1 to 7
println(recurse(first, Seq(3, 5)))
// List(3, 3, 3, 3, 5, 5, 5)
println(recurse(first, Seq(3, 5, 6)))
// List(3, 3, 3, 3, 5, 6, 6)