Scala,List to Pairs(elem,lastElement)

时间:2016-02-29 11:01:28

标签: scala

我有一份清单 List(1,2,3,99)我希望获得List((1,99),(2,99),(3,99))。我试图使用zip功能,但我想这是直接的方法。

4 个答案:

答案 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.headl.tail代替l.lastl.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)