在scala

时间:2017-02-06 08:20:11

标签: scala

由于我是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 }(减少后)部分:/还有其他(更漂亮)的方法吗?

5 个答案:

答案 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的效果相似,因为reversesize都是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