访问Scala中字符串的Nx2矩阵中的值

时间:2017-12-20 11:00:21

标签: scala

我有以下内容:

var data = Array[Array[String]]()

data :+= Array("item1", "")
data :+= Array("item2", "")
data :+= Array("item3", "")

我想以某种方式访问​​某个"键"的第二个元素(值可以说)。在data。我现在必须这样做:

data(2)(1) = "test"

但是我想这样做而不必担心索引,我可以称之为" key"并修改该值,例如data("item1") = "test"

我不得不使用这个矩阵字符串数组,这显然不是最佳的,但这是我必须使用的。如何使用我的数据结构执行此操作?

另外,如果我要更改数据结构,那么Scala数据结构最好是什么? (我正在考虑改变它,但不太可能)

1 个答案:

答案 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)和可变容器(如Arraymutable.Map ... Arrays是java不可避免的遗产,但你通常不应该改变他们)。使用不可变和引用透明语句的代码更容易阅读,维护和推理,而且更不容易出错。如果正确实现,scala中99%的实际用例不需要可变状态。因此,您可能只是假装vars和可变容器根本不存在,并且一旦分配了它就不能更改任何值,直到您已经学会了足够的scala来告诉它可能是一个好主意。当真正需要突变时,1%的病例。