[英]Map inside Map in Scala
我有這個代碼:
val total = ListMap[String,HashMap[Int,_]]
val hm1 = new HashMap[Int,String]
val hm2 = new HashMap[Int,Int]
...
//insert values in hm1 and in hm2
...
total += "key1" -> hm1
total += "key2" -> hm2
....
val get = HashMap[Int,String] = total.get("key1") match {
case a : HashMap[Int,String] => a
}
這項工作,但我知道是否存在更好(更可讀)的方法來做到這一點。 謝謝大家 !
看起來你正試圖將元組重新實現為地圖。
val total : ( Map[Int,String], Map[Int,Int]) = ...
def get : Map[Int,String] = total._1
(編輯:哦,對不起,我現在明白了)
事情就是這樣:上面的代碼不起作用。 類型參數被擦除 ,因此上面的匹配將始終返回true - 例如,嘗試使用key2
。
如果要在Map
上存儲多個類型並在后面檢索它們,則需要使用Manifest
和專門的get
和put
方法。 但這已經是Stack Overflow的答案了,所以我不會在這里重復一遍。
最好避免使用包含非統一值類型的地圖的total
地圖。 問題是,當您在"key1"
檢索地圖,然后將其轉換為字符串地圖時,為什么選擇String
?
最簡單的原因可能是key1
等等只是常量,你在編寫代碼時就知道了所有這些常量。 在這種情況下,您可能應該為每個地圖都有一個val
,並完全省去地圖地圖。
可能是客戶端代碼發出的調用具有此知識。 假設客戶端執行stringMap(“key1”)或intMap(“key2”)或者這種或那種方式,調用意味着某些給定的類型是預期的。 客戶負責不混合類型和名稱。 在這種情況下,沒有理由總計。 你會得到一個字符串映射的映射,一個int映射的映射(前提是你以前知道有限數量的值類型)
你總共有什么理由?
首先:這是一個非答案(因為我不推薦我討論的方法),但評論太長了。
如果您的ListMap中沒有太多不同的鍵,我建議嘗試Malvolio的答案。 否則,由於類型擦除,基於模式匹配的其他方法實際上等同於此(這是有效的,但是非常不安全):
val get = total("key1").asInstanceOf[HashMap[Int, String]]
這是不安全的原因(除非你喜歡生活危險)是:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.