簡體   English   中英

在Scala中映射內部地圖

[英]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和專門的getput方法。 但這已經是Stack Overflow的答案了,所以我不會在這里重復一遍。

最好避免使用包含非統一值類型的地圖的total地圖。 問題是,當您在"key1"檢索地圖,然后將其轉換為字符串地圖時,為什么選擇String

最簡單的原因可能是key1等等只是常量,你在編寫代碼時就知道了所有這些常量。 在這種情況下,您可能應該為每個地圖都有一個val ,並完全省去地圖地圖。

可能是客戶端代碼發出的調用具有此知識。 假設客戶端執行stringMap(“key1”)或intMap(“key2”)或者這種或那種方式,調用意味着某些給定的類型是預期的。 客戶負責不混合類型和名稱。 在這種情況下,沒有理由總計。 你會得到一個字符串映射的映射,一個int映射的映射(前提是你以前知道有限數量的值類型)

你總共有什么理由?

首先:這是一個非答案(因為我不推薦我討論的方法),但評論太長了。

如果您的ListMap中沒有太多不同的鍵,我建議嘗試Malvolio的答案。 否則,由於類型擦除,基於模式匹配的其他方法實際上等同於此(這是有效的,但是非常不安全):

val get = total("key1").asInstanceOf[HashMap[Int, String]]

這是不安全的原因(除非你喜歡生活危險)是:

  1. total(“key1”)未返回Option(與total.get(“key1”)不同)。 如果“key1”不存在,則會拋出NoSuchElementException。 我不知道你是怎么計划管理“無”案件的。
  2. asInstanceOf也會很高興地將total(“key2”) - 它應該是一個HashMap [Int,Int],但在這一點上是一個HashMap [Int,Any] - 到一個HashMap [Int,String]。 稍后當您嘗試訪問Int值(現在scala認為是String)時,您將遇到問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM