是否有可能改变与此类似线程斯卡拉名单的只有最后一个元素 - Transform only the first element of a Scala list变换Scala的名单只有最后一个元素
3
A
回答
8
另一个类似的方法是:
l match{
case Nil => Nil
case xs :+ y => xs :+ change(y)
}
2
你可以做这样的事情:
val l2 = l1.dropRight(1) :+ change(l1.last)
话虽如此,请记住,列表是访问其头部(并在尾部进行操作)的良好数据结构,但对于随机和直接访问而言效率非常低。如果您需要访问最后一个元素,那么使用直接访问结构(如数组或向量)会更有效率。
-1
必须承认,List
这个代码效率相当低。 splitAt
函数具有复杂性O(n)
...但同样的复杂性具有.last
函数。假设获得更好的性能,你应该使用一些索引集合而不是列表。
l.splitAt(l.size - 1) match {
case (l1, l2) => l1 ::: l2.map(modify(_))
}
1
也许你正在寻找的东西,如: list.init :+ changes(list.last)
但是例如由@mfirry提供的运行速度更快和安全。 对于良好的性能,您可以使用矢量而不是列表。
0
版本(根据链接问题中接受的答案进行调整)只能遍历列表两次。并且很明显:)
val l2 = (l1.reverse match{
case Nil => Nil
case x::xs => change(x)::xs
}).reverse
如果您有一个不可变的列表,那么不可能比迭代两次做得更好。一旦找到在端部元件,第二个与被改变的一个
0
稍微更通用的版本来替换它(仍然接受只列出了其输入)
def mutateLast[A, R](l: List[A])(f: A => A)(implicit cb: CanBuildFrom[List[A], A, R]): R = {
val builder = cb(l)
@annotation.tailrec
def loop(l: List[A]): R = l match {
case Nil => builder.result()
case h :: Nil =>
builder += f(h)
builder.result()
case h :: t =>
builder += h
loop(t)
}
loop(l)
}
val l = List(1, 2, 3)
val mutated = mutateLast(l)(x => x * 2)
println(mutated)
}
相关问题
- 1. 阵的字符串替换只有最后一个元素
- 2. jQuery的只在最后一个元素
- 3. 隐藏只有最后一个元素,如果家长有(15,45,75,105)元素(CSS只)
- 4. Scrapy只产生最后一个元素
- 5. Foreach只重复最后一个元素
- 6. ListView只显示最后一个元素
- 7. ArrayList只显示最后一个元素
- 8. Arrayadapter只返回最后一个元素
- 9. 的foreach改变最后一个元素
- 10. retainAll改变最后一个元素
- 11. 流行音乐来自列表的最后一个元素Scala
- 12. 只有最后一个React元素在循环中呈现
- 13. 如何将scala Xml元素的列表转换为单个scala元素?
- 14. 最后一个元素
- 15. 最后一个元素
- 16. 呼叫流()降低()名单上只有一个元素
- 17. 一个customadapter只显示最后一个元素
- 18. 最后一个元素在一个div中的类名
- 19. stopPropagation()只有一个元素
- 20. 只有最后一个单元格被添加到行
- 21. jquery.append() - 只有我名单的最后一个元素被添加,以前的被删除
- 22. 如何只替换R中多个变量名的最后一个字符?
- 23. 自定义单元格,只有最后一个单元格获取[layoutSubviews]?
- 24. 交换第一个和最后一个元素haskell
- 25. 如何交换第一个和最后一个DOM元素
- 26. 在scala中,是否有可能只有两个元素的Set?
- 27. foreach只发现数组的最后一个元素
- 28. “的foreach +如果”只适用于最后一个元素
- 29. C++中的矢量只能读取最后一个元素
- 30. Angular指令只适用于ng-repeat的最后一个元素
此迭代通过同一个列表两次。 – Rumoku
这实际上是3次,因为插入到最后的位置。我已经强调,使用列表并不是最理想的。 – hasumedic