在 Scala 上合并可变列表中的对象
Merge objects in mutable list on Scala
我最近开始研究 Scala 代码,并试图了解如何解决问题。
我有一个可变的对象列表,这些对象有一个 id: String
和 values: List[Int]
。我获取数据的方式,不止一个对象可以有相同的 id。我正在尝试合并列表中的项目,因此,例如,如果我有 3 个 ID 为 123 的对象和任何值,我最终只会得到一个具有 ID 的对象,以及 3 个组合的值。
我可以通过 java 方式、迭代等方式来做到这一点,但我想知道是否有更简单的特定于 Scala 的方式来解决这个问题?
首先要做的是避免使用可变数据,并考虑将一个不可变对象转换为另一个。因此,与其改变一个集合的内容,不如考虑从旧集合创建一个新集合。
完成后实际上非常简单,因为这是 Scala 库直接支持的事情。
case class Data(id: String, values: List[Int])
val list: List[Data] = ???
val result: Map[String, List[Int]] =
list.groupMapReduce(_.id)(_.values)(_ ++ _)
groupMapReduce
调用分为三个部分:
第一部分按 id
字段对数据进行分组,并将其作为键。这给出了 Map[String, List[Data]]
第二部分提取 values
字段并将其作为数据,因此现在的结果是 Map[String, List[List[Int]]]
第三部分将所有 values
字段组合成一个列表,给出最终结果 Map[String, List[Int]]
我最近开始研究 Scala 代码,并试图了解如何解决问题。
我有一个可变的对象列表,这些对象有一个 id: String
和 values: List[Int]
。我获取数据的方式,不止一个对象可以有相同的 id。我正在尝试合并列表中的项目,因此,例如,如果我有 3 个 ID 为 123 的对象和任何值,我最终只会得到一个具有 ID 的对象,以及 3 个组合的值。
我可以通过 java 方式、迭代等方式来做到这一点,但我想知道是否有更简单的特定于 Scala 的方式来解决这个问题?
首先要做的是避免使用可变数据,并考虑将一个不可变对象转换为另一个。因此,与其改变一个集合的内容,不如考虑从旧集合创建一个新集合。
完成后实际上非常简单,因为这是 Scala 库直接支持的事情。
case class Data(id: String, values: List[Int])
val list: List[Data] = ???
val result: Map[String, List[Int]] =
list.groupMapReduce(_.id)(_.values)(_ ++ _)
groupMapReduce
调用分为三个部分:
第一部分按 id
字段对数据进行分组,并将其作为键。这给出了 Map[String, List[Data]]
第二部分提取 values
字段并将其作为数据,因此现在的结果是 Map[String, List[List[Int]]]
第三部分将所有 values
字段组合成一个列表,给出最终结果 Map[String, List[Int]]