2015-01-16 83 views
1

我有是這樣創造了一個數據結構:重組模式匹配

// [Measure -> [Installation -> [Year -> [Month -> [Day -> [Hour -> BigDecimal] ]]]]] 
private var dayList = new mutable.HashMap[String, mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]]]]]() 

這樣做的原因是,我希望能夠看看這個映射了讓我的數據。

然而,在斯卡拉插入此數據結構我得到這樣的:

dayList.get(col) match { 
     case Some(measureLook) => 
      measureLook.get(installation) match { 
      case Some(instaLook) => 
       instaLook.get(tempYear) match { 
       case Some(yearLook) => 
        yearLook.get(tempMonth) match { 
        case Some(monthLook) => 
         monthLook.put(tempDay, hourCounter) 
        case None => 
         val m = new mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]() 
         m.put(tempDay, hourCounter) 
         yearLook.put(tempMonth, m) 
        } 
       case None => 
        val y = new mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]]() 
        val m = new mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]() 
        m.put(tempDay, hourCounter) 
        y.put(tempMonth, m) 
        instaLook.put(tempYear, y) 
       } 
      case None => 
       val in = new mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]]]() 
       val y = new mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]]() 
       val m = new mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]() 
       m.put(tempDay, hourCounter) 
       y.put(tempMonth, m) 
       in.put(tempYear, y) 
       measureLook.put(installation, in) 
      } 
     case None => 
      val me = new mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]]]]() 
      val in = new mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]]]() 
      val y = new mutable.HashMap[Int, mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]]() 
      val m = new mutable.HashMap[Int, mutable.HashMap[Int, BigDecimal]]() 
      m.put(tempDay, hourCounter) 
      y.put(tempMonth, m) 
      in.put(tempYear, y) 
      me.put(installation, in) 
      dayList.put(col, me) 
     } 

這對我來說是一個代碼量瘋狂。我覺得這可能會縮短,但我沒有看到解決方案。

因爲我必須查找元素,如果它存在,那麼我可以很容易地插入元素。

但是,如果鏈中的元素不存在,那麼我必須創建元素,當然還有所有的子元素,就像你在上面的代碼中看到的那樣。

你有什麼想法,我怎麼能做到這一點更乾淨或可能使用更有組織的數據結構呢?

+0

用於理解。如果你提供一些樣本數據,我可以寫一個例子。 –

+0

嗯,我有我使用的MongoDB的一些輸出。 http://pastebin.com/12n6Tre7 – miniwolf

回答

2

考慮定義的情況下,類爲每個

[Measure -> [Installation -> [Year -> [Month -> [Day -> [Hour -> BigDecimal]]]]]] 

即例如

case class Data(Measure: String, 
       Installation: String 
       date: java.util.Date, 
       n: BigDecimal) 

收集所有成Array[Data]可以由感興趣的現場被索引Map

更新

對索引的肖像畫上MeasureInstallation

val info[Array[Data]] = Array(data_1,..., data_n) 
val meInsIdx = info.map (d => (d.Measure,d.Installation) -> d).toMap 

Map鍵不必是唯一的。要查詢一個data_imeInsIdx考慮例如

val data_i = meInsIdx.get(measure_i, installation_i) 

它提供一個Option[Data](或者Some(data_i)None一個鍵不存在)。

+0

我認爲你的解決方案是我能想到的最好的解決方案。處理它對也可以。但是,當然把它們交給a會很痛苦,特別是在函數調用中作爲參數。 謝謝你的解決方案。 – miniwolf

+0

通過將'Array [Data]'索引到Map上,你究竟意味着什麼?你能告訴我一個例子的代碼嗎? – miniwolf

+0

請注意索引更新。謝謝 ! – elm