由于我是scala的新手,因此在很多情况下我会搜索很多内容并找到好的答案。但是我无法找到这个具体问题的答案,因为谷歌搜索"后期减少了scala"只带来dontcha-use-post-decrement-in-scala-因为它是一个功能语言 - 回答顶部。
所以,我真的想知道执行以下操作的功能方式:
object A {
val list = List("a", "b", "c")
val map = {
var ord = list.size
Map(list map { x => (x, { val res = ord; ord -= 1; res } ) } : _* )
}
}
class Test extends org.scalatest.FunSuite {
test("") {
println(A.map) // Map(a -> 3, b -> 2, c -> 1)
}
}
它基本上是从给定列表创建一个映射,并为列表的每个元素分配递减的序数(实际代码当然比这个最小的例子更复杂)。
我特别不满意var ord = ...
(可变)和{ val res = ord; ord -= 1; res }
(减少后)部分:/还有其他(更漂亮)的方法吗?
答案 0 :(得分:2)
快速解决方案需要撤消列表,然后您可以使用zipWithIndex
:
scala> :pa
// Entering paste mode (ctrl-D to finish)
List("a", "b", "c")
.reverse
.zipWithIndex
.toMap
// Exiting paste mode, now interpreting.
res4: scala.collection.immutable.Map[String,Int] = Map(c -> 0, b -> 1, a -> 2)
如果您不介意额外收藏品的分配,可以删除view
。
答案 1 :(得分:2)
zip对此有帮助,
list.reverse.zip(1 to list.size + 1).toMap
答案 2 :(得分:1)
还有另一个变种
list.zip(list.size to 1 by -1).toMap
与.reverse.zipWithIndex
的效果相似,因为reverse
和size
都是O(N)
答案 3 :(得分:0)
你可以简单地写一下:
val list = List("a","b","c")
list.map ( elem => (elem, list.size - list.indexOf(elem))).toMap
它会给你这样的结果:
scala.collection.immutable.Map[String,Int] = Map(a -> 3, b -> 2, c -> 1)
答案 4 :(得分:0)
试试这个:
list.toIterator.zip(Iterator.iterate(list.size){_-1}).toMap