重构模式匹配

Restructuring pattern matching

我有一个这样创建的数据结构:

// [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]]]]]]()

这样做的原因是我希望能够查找此映射以获取我的数据。

然而,在 scala 中插入到这个数据结构中,我得到这样的东西:

    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)
      }

这对我来说是疯狂的代码量。我觉得这可以以某种方式缩短,但我没有看到解决方案。

因为我要查找元素,如果存在,那么我可以很容易地插入到元素中。

但是,如果链中某处的元素不存在,那么我必须创建该元素,当然还有所有子元素,如您在上面的代码中所见。

你有什么想法可以让我更干净地完成这项工作,或者为此使用更有条理的数据结构吗?

考虑为每个

定义一个案例 class
[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 键必须是唯一的。要在 meInsIdx 中查询 data_i,请考虑

val data_i = meInsIdx.get(measure_i, installation_i)

它提供了一个 Option[Data]Some(data_i)None 对于不存在的密钥)。