use*_*735 9 scala map scala-2.8 scala-collections
我有一个三级数据结构(缩进和换行符以便于阅读):
scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map
scala> val m = Map("normal" -> Map("home" -> Map("wins" -> 0, "scores" -> 0),
"away" -> Map("wins" -> 0, "scores" -> 0)))
m: scala.collection.mutable.Map[java.lang.String,
scala.collection.mutable.Map[java.lang.String,
scala.collection.mutable.Map[java.lang.String,Int]]] =
Map((normal,Map(away -> Map(wins -> 0, scores -> 0),
home -> Map(wins -> 0, scores -> 0))))
Run Code Online (Sandbox Code Playgroud)
访问最里面的数据(分数)需要大量输入:
import org.scalatest.{Assertions, FunSuite}
class MapExamplesSO extends FunSuite with Assertions {
test("Update values in a mutable map of map of maps") {
import scala.collection.mutable.Map
// The m map is essentially an accumulator
val m = Map("normal" ->
Map("home" -> Map("wins" -> 0, "scores" -> 0),
"away" -> Map("wins" -> 0, "scores" -> 0)
)
)
//
// Is there a less verbose way to increment the scores ?
//
assert(m("normal").apply("home").apply("scores") === 0)
val s1 = m("normal").apply("home").apply("scores") + 1
m("normal").apply("home").update("scores", s1)
assert(m("normal").apply("home").apply("scores") === 1)
val s2 = m("normal").apply("home").apply("scores") + 2
m("normal").apply("home").update("scores", s2)
assert(m("normal").apply("home").apply("scores") === 3)
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方法来修改分数的价值?
我是Scala的新手,因此对上述代码的所有其他观察也是受欢迎的.
whe*_*ies 21
您不必使用"apply",只需使用"()"即可
m("normal")("home")("scores") = 1
Run Code Online (Sandbox Code Playgroud)
Lan*_*dei 10
你可以写
m("normal").apply("home").apply("scores")
Run Code Online (Sandbox Code Playgroud)
如
m("normal")("home")("scores")
Run Code Online (Sandbox Code Playgroud)
但是我不确定这样的结构是不是一个好主意.也许您应该考虑将此功能封装在专门的类中.
| 归档时间: |
|
| 查看次数: |
12971 次 |
| 最近记录: |