Cats半组将HashMaps列表合并到一个Scala中。

问题描述 投票:0回答:1

我有一个HashMaps列表如下。

val listHashMaps = List(Map(1 -> List("one", "A") , Map(2 -> List("two", "B"), Map(3 -> List("three", "C"), Map(4 -> List("four", "D")

我想把这些HashMaps合并成一个单一的HashMap,如下图所示。

 Map(1 -> List("one", "A"), 2 -> List("two", "B"), 3 -> List("three", "C", 4 -> List("four", "D")

我已经尝试了

listHashMaps.flatten.ToHashMap,但似乎并不奏效。我读到可以使用catsas中的semigroups来实现,但我似乎想不出如何在List上进行迭代,以便将HashMaps合并成一个单一的HashMaps.我有一个列表,如下所示: val listHashMaps = List(Map(1 -> List("one", "A"" , Map(2 -> List("two")。

val combinedMap = Semigroup[HashMap[Int, List[String]]].combine(aMap, anotherMap)
merge hashmap scala-cats semigroup
1个回答
0
投票

你可以使用任一使用 NonEmptyList 然后是默认的半群(这将只是连接地图),或者你可以使用不安全的 .reduce 作用于 List.

不安全的原因是会在空列表上炸掉。例子:

import cats.data.NonEmptyList

import scala.collection.immutable
import cats.implicits._

object Foo extends App {

  val listHashMaps: List[Map[Int, List[String]]] = List(
    Map(1 -> List("one", "A")),
    Map(2 -> List("two", "B")),
    Map(3 -> List("three", "C")),
    Map(4 -> List("four", "D"))
  )

  val one: Map[Int, List[String]] = listHashMaps.reduce(_ ++ _)

  // safe
  val nonEmpty: NonEmptyList[Map[Int, List[String]]] = NonEmptyList.of(
    Map(1 -> List("one", "A")),
    Map(2 -> List("two", "B")),
    Map(3 -> List("three", "C")),
    Map(4 -> List("four", "D"))
  )

  val two: Map[Int, List[String]] = nonEmpty.reduce

  println(one)
  println(two)
}
© www.soinside.com 2019 - 2024. All rights reserved.