我有一份清单
List(1,2,3,99)
我希望获得List((1,99),(2,99),(3,99))
。我试图使用zip
功能,但我想这是直接的方法。
答案 0 :(得分:4)
也许不是最好的解决方案,但在这里:
l map ((_, l.last)) init
另一个疯狂的想法可能是:
l.init zip List.fill(l.length -1)(l.last)
答案 1 :(得分:1)
使用此代码,您不必担心带有一个元素的列表或者是空的。
val resultList:List[(Int,Int)] = List(1,2,3,99) match {
case Nil => Nil
case x :: Nil => //do what you have to do if there is only one element
case xs => xs.init zip Stream.continually(xs.last) //an infinit stream of the last element
}
答案 2 :(得分:1)
对我来说,最可读的似乎是使用zip
,压缩无限重复的最后一个元素:
l.init zip Stream.continually(l.last)
缺点是重复评估l.last
,因此如果您关心大型列表的性能,您可能更愿意首先将其分配给值:
val last = l.last
l.init zip Stream.continually(last)
或者您可以使用from
以零步骤来避免延迟评估:
l.init zip Stream.from(l.last, 0)
可以使用map
完成类似的版本,映射除最后一个元素之外的所有元素 - 再次,l.last
将在每次迭代时进行评估,除非被变量替换:
l.init map ((_, l.last))
如果您更改输入以便重复元素首先显示(List(99,1,2,3)
),则可以使用l.head
和l.tail
代替l.last
和l.init
,这更自然,没有性能缺陷:
l.tail zip Stream.continually(l.head)
或:
l.tail map ((_, l.head))
答案 3 :(得分:1)
使用for comprehension,对于给定列表xs
,
for (i <- xs.init; z = xs.last) yield (i,z)
在有序集合中,init
提供除最后元素之外的所有元素。
<强>更新强>
一种处理空列表的方法,
for (i <- xs.dropRight(1); z <- xs.takeRight(1)) yield (i,z)