【问题标题】:Convert list to TreeMap in Map将列表转换为 Map 中的 TreeMap
【发布时间】:2020-10-01 06:20:42
【问题描述】:

我有一个像这样记录的地图列表

List(Map(id => 123, Date => 2020.04.01, Value => abc),
     Map(id => 123, Date => 2020.04.03, Value => def),
     Map(id => 456, Date => 2020.04.04, Value => eee),
     Map(id => 456, Date => 2020.04.02, Value => bcd))

我想将其转换为如下内容以供进一步处理:

Map(id => 123, TreeMap(Date=>2020.04.01, Value => abc; Date=>2020.04.03, Value => def);
    id => 456, TreeMap(Date=>2020.04.02, Value => bcd; Date=>2020.04.04, Value => eee))

我有以下代码可以做到这一点:

val result = mutable.Map[String, mutable.TreeMap[String, String]]();
list.foreach(m => {
  val id = m("id")
  if (!result.contains(id))
    result += id -> mutable.TreeMap.empty[String, String]
  result(id) += m("date") -> m("value")
})

只是想知道是否有一些聪明的方法可以做到这一点?我知道有 toMap() 方法,但不确定如何在 toMap 方法中初始化 TreeMap。

【问题讨论】:

  • TreeMap 在您的示例中包含重复键。

标签: scala


【解决方案1】:

假设您的 result 代码是正确的,那么这就是 FP(不可变)方式的相同内容。

import scala.collection.immutable.TreeMap

List(Map("id" -> "123", "Date" -> "2020.04.01", "Value" -> "abc")
    ,Map("id" -> "123", "Date" -> "2020.04.03", "Value" -> "def")
    ,Map("id" -> "456", "Date" -> "2020.04.04", "Value" -> "eee")
    ,Map("id" -> "456", "Date" -> "2020.04.02", "Value" -> "bcd"))
  .foldLeft(Map.empty[String,TreeMap[String,String]]
               .withDefaultValue(TreeMap.empty[String,String])){
    case (acc, m) => 
      val id = m("id")
      acc + (id -> (acc(id) + (m("Date") -> m("Value"))))
  }

//val res0: immutable.Map[String,TreeMap[String,String]] = 
//   Map(123 -> TreeMap(2020.04.01 -> abc, 2020.04.03 -> def)
//     , 456 -> TreeMap(2020.04.02 -> bcd, 2020.04.04 -> eee))

【讨论】:

  • withDefault 可能会导致令人惊讶的结果,因为该默认值在foldLeft 之后保留。我会在foldLeft 的正文中使用updatedWith
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 2016-10-31
  • 2020-03-16
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多