说我有以下两个case classes:
case class Address(street: String, city: String, state: String, zipCode: Int)
case class Person(firstName: String, lastName: String, address: Address)
Run Code Online (Sandbox Code Playgroud)
和以下Person类的实例:
val raj = Person("Raj", "Shekhar", Address("M Gandhi Marg",
"Mumbai",
"Maharashtra",
411342))
Run Code Online (Sandbox Code Playgroud)
现在,如果我想更新zipCode,raj那么我将不得不做:
val updatedRaj = raj.copy(address = raj.address.copy(zipCode = raj.address.zipCode + 1))
Run Code Online (Sandbox Code Playgroud)
随着嵌套水平的提高,这将变得更加丑陋.是否有更清洁的方式(像Clojure的东西update-in)来更新这样的嵌套结构?
我知道几个类似的问题.它们对我没有帮助 - 如果没有现有密钥,代码就不起作用.
我只需要一些很好的方法来附加Map,将值添加到现有密钥(如果它确实存在)或将其作为新密钥(如果map不包含适当的密钥).
以下代码有效,但我不喜欢它:
val a = collection.mutable.Map(("k1" -> 1), ("k2" -> 5))
val key = "k1"
val elem = a.get(key)
if (elem == None) {
a += ("k5" -> 200)
} else {
a.update(key, elem.get + 5)
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的一点?当前的Scala版本是2.10.4,我目前无法切换到2.11.可变图不是100%限制,而是优选的.
例如,这是类似的问题,但我还需要考虑不存在的那个不存在的密钥的情况.至少我们应该理解a.get(key)可能是None或添加一些更好的方法.好主意|+|但是我想保留基本的Scala 2.10.x.
我有一个父键列表,每个父键可能有零个或多个关联值.我不确定要使用哪个集合.
我在用 Map[Int,List[String]]
我宣布地图为
var nodes = new HashMap[Int, List[String]]
Run Code Online (Sandbox Code Playgroud)
然后我有两种方法来处理添加新元素.第一种是添加新密钥addNode,第二种是添加新值addValue.最初,密钥不会有任何与之关联的值.稍后,在执行期间,将关联新值.
def addNode(key: Int) = nodes += (key -> "")
def addValue(key: Int, value: String) = ???
Run Code Online (Sandbox Code Playgroud)
我不确定如何实施 addValues
为了回应@ oxbow-lakes的回答,这是我收到的错误.请注意,密钥不需要具有与之关联的值.
scala> var nodes = Map.empty[Int, List[String]]
nodes: scala.collection.immutable.Map[Int,List[String]] = Map()
scala> nodes += (1->null)
scala> nodes += (1 -> ("one" :: (nodes get 1 getOrElse Nil)))
java.lang.NullPointerException
at .<init>(<console>:9)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) …Run Code Online (Sandbox Code Playgroud) 我需要更新(检索并增加)绑定到地图中两个键的两个不同值.这两个键有时会重合.我现在有以下代码:
// val map: Map[Int, Int]
// val key1, key2: Int
if (key1 == key2) {
tailRecFunction(someArg, map
+ Tuple2(key1, 2 + map.getOrElse(key1, 0)))
} else {
tailRecFunction(someArg, map
+ Tuple2(key1, 1 + map.getOrElse(key1, 0))
+ Tuple2(key2, 1 + map.getOrElse(key2, 0)))
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,如果您使用else块时key1 == key2,则值key1 == key2将会错误地增加1而不是2---第二个元组错误地更新原始值,而不是第一个元组应用的值.
是否有更清晰的方式来写这个?
scala ×4
map ×2
case-class ×1
collections ×1
containers ×1
dictionary ×1
idiomatic ×1
zipper ×1