首页 > 解决方案 > 将列表转换为 Map 中的 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))

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

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。

标签: scala

解决方案


假设您的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))

推荐阅读