我有一个列表 List(1,2,3,99)
,我想得到一个List((1,99),(2,99),(3,99))
。我试图使用zip
函数,但我想有一个直接的方法来做到这一点。斯卡拉,列出对(elem,lastElement)
回答
对我来说,最可读的,似乎使用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
来完成,映射所有但tupled最后元件的最后一个 - 再次,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))
也许不是最好的解决办法,但这里有云:
l map ((_, l.last)) init
另一种疯狂的想法可能是:
l.init zip List.fill(l.length -1)(l.last)
'选择除了last' http://www.scala-lang.org/api/2.11所有元素.7/index.html#scala.collection.immutable.List @ init:Repr – mfirry
与此代码,你不需要担心列出一个元素或是空的。
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
}
第二种情况是不必要的:第三种情况将返回空列表,因为对于一个元素列表,“xs.init”将为空。 – Suma
这是对的,但也许他有一个要求如何处理这种情况。情况2是有逻辑而非技术原因的。 –
使用的理解,对于给定的名单xs
,
for (i <- xs.init; z = xs.last) yield (i,z)
在一个有序集合,init
提供所有,但最后的元素。
更新
,处理空列表,以及一个方法,
for (i <- xs.dropRight(1); z <- xs.takeRight(1)) yield (i,z)
我非常喜欢这个。使用'for'是一种很好的方式,可以在不需要使用多个语句的情况下为'last'引入一个变量。 – Suma
- 1. 斯卡拉对象
- 2. 斯卡拉系列
- 3. 转换一览[名单[对象]列出[对象]在斯卡拉
- 4. 斯卡拉生成列表唯一对
- 5. 斯卡拉 - 可以'这个'在斯卡拉为空对象?
- 6. 斯卡拉,parametherised对象
- 7. 提高对JVM斯卡拉
- 8. 斯卡拉保护对象
- 9. 斯卡拉对变换Seq
- 10. 斯卡拉在斯卡拉类
- 11. 斯卡拉链接列表
- 12. 斯卡拉 - Haskell的序列
- 13. 斯卡拉列表匹配
- 14. 斯卡拉 - 查找列表
- 15. 反向列表斯卡拉
- 16. 斯卡拉匹配列表
- 17. 然后列表斯卡拉
- 18. 斯卡拉从列表
- 19. 斯卡拉:列表性能
- 20. 斯卡拉列表索引
- 21. 斯卡拉:筛选列表
- 22. 斯卡拉系列化
- 23. 序列在斯卡拉
- 24. 卡夫卡与斯卡拉
- 25. 在斯卡拉
- 26. 在斯卡拉
- 27. 斯卡拉
- 28. 在斯卡拉
- 29. 在斯卡拉
- 30. 斯卡拉
Stream类似乎更容易。我不知道那堂课。 – Guille
请注意'List#last'是一个部分函数:'scala> List()。last java.util.NoSuchElementException' –