我有以下内容:
var data = Array[Array[String]]()
data :+= Array("item1", "")
data :+= Array("item2", "")
data :+= Array("item3", "")
我想以某种方式访问某个"键"的第二个元素(值可以说)。在data
。我现在必须这样做:
data(2)(1) = "test"
但是我想这样做而不必担心索引,我可以称之为" key"并修改该值,例如data("item1") = "test"
。
我不得不使用这个矩阵字符串数组,这显然不是最佳的,但这是我必须使用的。如何使用我的数据结构执行此操作?
另外,如果我要更改数据结构,那么Scala数据结构最好是什么? (我正在考虑改变它,但不太可能)
答案 0 :(得分:1)
使用Map
val items = mutable.Map("foo" -> "bar", "bar" -> "bat")
items.update("foo", "baz")
如果你必须坚持使用数组,这样的东西就可以了
data.find(_.head == "foo").foreach { _(1) = "baz" }
你可以看起来像一个带有一点隐含技巧的函数调用:
object ArrayAsMap {
implicit class Wrapper(val it:Array[String]) extends AnyVal {
def <<-(foo: String) = it(1) = foo
}
implicit class Wrapper2(val it: Array[Array[String]]) extends AnyVal {
def apply(s: String) = Wrapper(it.find(_.head == s).get)
}
implicit def toarray(w: Wrapper) = w.it
}
现在,你可以写下这样的作业:
import ArrayAsMap._
data("foo") <<- "bar"
关于此的一些事情:
你正在使用的方法是真的坏:你不仅要每次扫描整个数组来找到密钥,你还要对内容做出隐含的假设(外部)数组,这是特别糟糕的,因为它是可变的。类似这样的data("foo") = Array.empty
会导致代码在运行时严重崩溃。
你应该避免使用可变状态(var
)和可变容器(如Array
或mutable.Map
... Arrays
是java不可避免的遗产,但你通常不应该改变他们)。使用不可变和引用透明语句的代码更容易阅读,维护和推理,而且更不容易出错。如果正确实现,scala中99%的实际用例不需要可变状态。因此,您可能只是假装vars
和可变容器根本不存在,并且一旦分配了它就不能更改任何值,直到您已经学会了足够的scala来告诉它可能是一个好主意。当真正需要突变时,1%的病例。