重构模式匹配
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
中。
更新
关于 Measure
和 Installation
、
索引的描述
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
对于不存在的密钥)。
我有一个这样创建的数据结构:
// [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
中。
更新
关于 Measure
和 Installation
、
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
对于不存在的密钥)。