scala - 将列表转换为 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。
解决方案
假设您的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))
推荐阅读
- javascript - 脚本源的动态更改不起作用
- mongodb - 是否可以在另一个查询MongoDB中输入一个查询的结果作为条件
- python - python程序运行时间太长/不会结束
- jquery - 如何传递属性仍然输入字段的数据?
- angular - TypeScript:为什么我的对象在记录时“未定义”?
- ruby-on-rails - Simplecov 在 Rails 6 中没有显示正确的覆盖率
- reactjs - 使用 DynamicRoutes、nextJS 和 useEffect 在 React 中获取数据
- html - 如何在移动和 Safari 上选择 CSS 背景图像以供选择
- pandas - Pandas fillna 功能未按预期运行
- kotlin - Kotlin 智能转换在 Iterable<*> 上失败