Добавить карту (ключ, установить [значение]) в карте к существующему ключу в Scala 2.11 - PullRequest
5 голосов
/ 05 июля 2019

Я пытаюсь добавить новое значение в Set (Значения) для существующего ключа, но оно заменяет существующее значение.

Это мой ввод

val roads = Array(Array(0,1),Array(0,2),Array(1,2))

Ожидаемый вывод:

Map(0 -> Set(1,2),1 -> Set(2))

Мой код:

  val roads = Array(Array(0,1),Array(0,2),Array(1,2))
  var adjMatrix:Map[Int,Set[Int]] = Map()

  for(i <- 0 until roads.size; j <- 1 until roads(i).size){
    adjMatrix += (roads(i)(0) -> Set(roads(i)(j)))
  }

и когда я делаю

  adjMatrix.foreach(println)

Я получаю результат ниже, так как есть два ключа с именем 0, он заменяет элемент (0,1) в 0-м индексе

(1,Set(2))
(0,Set(2))

Ответы [ 2 ]

5 голосов
/ 05 июля 2019

Попробуйте

roads
  .groupBy(a => a(0))
  .map { case (key, value) => key -> (value.flatten.toSet - key) }

который выводит

Map(1 -> Set(2), 0 -> Set(1, 2))
3 голосов
/ 05 июля 2019

Что вы можете сделать, это сначала извлечь ключ каждой группы.
Затем groupBy этот ключ.
И наконец, объедините все значения и превратите их в окончательный набор .

(Примечание: я изменил Массив с Список , поскольку извлечение tail из массива - очень дорогая операция.)

val roads = List(List(0,1),List(0,2),List(1,2))

val adjMatrix =
  roads.map {
    case x :: xs => x -> xs // This may fail if the list is empty!
  } groupBy {
    case (key, _) => key
  } map {
    case (key, values) => key -> values.flatMap(_._2).toSet // _._2 === case (_, values) => values.
  }

// adjMatrix: Map[Int, Set[Int]] = Map(1 -> Set(2), 0 -> Set(1, 2))

PS: Я бы рекомендовал вам обновить хотя бы до Scala 2.12.

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