2014-11-24 25 views
1

我有一个HashMap其中列出所有MyType元件斯卡拉 - 添加元素:的MyType到阵列=选项[的MyType]预期

var allMyType = new HashMap[String, MyType]() 

而另一HashMap含有Array的一些MyType一个元件

var secondHashMap = new HashMap[Any, Array[MyType]]() 

如果我创建一个secondHashMap元素只有一个MyType元素,我这样做:

secondHashMap.put(i, Array(allMyType.get(key))) 

但是,我有错误:

Type mismatch, expected : Array[Relation], actual : Array[Option[Relation]] 

更改线路

var secondHashMap = new HashMap[Any, Array[MyType]]() 

var secondHashMap = new HashMap[Any, Array[Option[MyType]]]() 

解决我的问题,但如果我想要一个MyType元素添加到现有的secondHashMap元素的Array

secondHashMap.put(563, secondHashMap.get(563)+=allMyType.get(key)) 

我得到错误:

Type mismatch, expected : Array[Option[Relation]], actual : Option[Array[Option[Relation]]] 

我该怎么做才能解决这类问题呢?

我希望很清楚:s,非常感谢。

回答

3

get方法返回值类型的选项,因为查找可能失败。这里的招牌:

def get(key: A): Option[B] 

您可以通过该选项调用getOrElse(默认值)解决这个问题,或者通过使用地图的应用方法,它返回A B,而不是B的选项但是你必须确保密钥存在,否则会出现异常。

所以

secondHashMap.put(i, Array(allMyType.get(key))) 

将变成:

secondHashMap.put(i, Array(allMyType(key))) 
+0

谢谢!今天我学到了一些新东西:) – 2014-11-24 18:20:00

0

作为替代,以防止你下去选项[阵列[A],数组[选项[A]路径,可以反转您最初的投产是这样的:

var allMyType = new HashMap[String, MyType]() 
var secondHashMap = new HashMap[Any, Array[MyType]]() 
allMyType.get(key).fold(MISSING KEY CASE)(x => secondHashMap.put(i, x)) 

对折这种情况下,查看在allMyType HashMap中找不到所请求密钥的身份案例(NONE),然后运行您需要的任何逻辑。相反,如果它不是身份(SOME(x)),那么它允许您使用x,而不使用换行选项。