Scala - Свести список карт на карту - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно сопоставить ключ с картой внутри списка в Scala. Другими словами, мне нужно go отсюда:

  Map(k1 -> List(Map(k2 -> v2)))

И получить это:

  Map(k1 -> Map(k2 -> v2))

Этот материал работает, но я ищу что-то более эффективное.

  val m1 = Map("k1" -> List(Map("k2" -> "v2")))
  val m2 = m1("k1").flatten.toMap
  val m3 = Map("k1" -> m2)

Есть мысли?

Заранее спасибо.

1 Ответ

2 голосов
/ 26 марта 2020

Как @Luis Miguel Mejía Suárez сказал, что это в основном что-то вроде

val maps = Map(k1 -> List(Map(k2 -> v2)))
def flattenMaps[K, V]: List[Map[K, V]] => Map[K, V] = ???
maps.mapValues(flattenMaps).toMap

Дьявол кроется в деталях вашей логики сплющивания c:

// assumes that list always of size 1, loses random elements if bigger, blows up if size=0
def flattenMaps[K, V]: List[Map[K, V]] => Map[K, V] = _.head

// last wins
def flattenMaps[K, V]: List[Map[K, V]] => Map[K, V] = _.foldLeft(Map.empty[K, V]) {
  (bigMap, map) => bigMap ++ map
}

// first wins
def flattenMaps[K, V]: List[Map[K, V]] => Map[K, V] = _.foldLeft(Map.empty[K, V]) {
  (bigMap, map) => map ++ bigMap
}

// if you want to optimize for some reason, you can use builder instead
def flattenMaps[K, V]: List[Map[K, V]] => Map[K, V] = _.foldLeft(Map.newBuilder[K, V]) {
  (builder, map) =>
     builder ++= map
     builder
}.result

// or basically any other logic that makes sense and is defined for any input that type-checks

Вы должны определить некоторое правильное поведение в случае, если в вашем списке будет более одного элемента (или его нет), иначе вы однажды удивитесь, если забудете о своих предположениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...