Scala:附加到数组的末尾,该数组是HashMap中的值

时间:2014-11-19 03:09:39

标签: arrays scala hashmap append type-mismatch

var temp = 5
val map = new HashMap[String,Array[Integer]]()
if(map contains str1){
   map(str1) = map(str1) :+ temp
}else{
   map(str1) = Array(temp)
}

基本上如果键不在地图中,我想将值设置为值为temp的新数组,如果键已经在地图中,我想将temp附加到现有数组的末尾。 temp是一个整数。

执行上述代码时,我收到以下错误:

helloworld.scala:21: error: type mismatch;
 found   : Array[Any]
 required: Array[Integer]
Note: Any >: Integer, but class Array is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: Integer`. (SLS 3.2.10)

                        map(str1) = (map(str1) :+ temp)
                                               ^

我是新scala,所以我完全不知道为什么会这样。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

此代码存在两个问题。我假设您首先使用可变HashMap,因为否则无法更新它。

首先,您收到编译错误,因为您已声明HashMap[String, Array[Integer]],但您尝试将Int附加到Array[Integer]。它们不是同一件事。因此,编译器将类型推断为Any,这是不允许的,因为Array的类型参数是不变的。

因此,请将您的声明更改为val map = new HashMap[String,Array[Int]]()。在scala中使用Integer没有多大理由。如果你真的需要使用val temp = new Integer(5),而不是。

您从第一个编译器中看不到的第二个问题是这不起作用:

map(str1) = Array(temp)

如果str1上不存在HashMap密钥,则调用map(str1)将引发异常,因此无法以这种方式分配新密钥。相反,您必须将键值对添加到地图中,如下所示:

map += (str1 -> Array(temp))