2014-11-24 24 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,而不使用換行選項。