Существуют ли определенные c правила или приоритет при использовании «+ =» для вставки данных в карту в Scala? - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь вставить данные во всплывающую Карту в Scala, разделив строку. Карта имеет String в качестве ключа и другую изменяемую Map [Int, Int] в качестве значения

var dm = mutable.Map[String, mutable.Map[Int, Int]]()
val c  = s.split(" ") // s = abc 0 -> c(0)=abc, c(1)=0

Я пытаюсь добавить c(0) в качестве основного ключа dm & c(1) в качестве ключа внутренней карты и 1 в качестве значения с использованием оператора +=

dm += c(0) -> (c(1).toInt -> 1)

Но я вижу эту ошибку компиляции в коде в этой строке dm += c(0) -> (c(1).toInt -> 1)

Cannot resolve symbol +=
Error:(18, 36) type mismatch;
 found   : (Int, Int)
 required: scala.collection.mutable.Map[Int,Int]
                else dm += c(0) -> (c(1).toInt -> 1)

c(0) - это строка, c(1) приводится к Int, а 1 - правильный тип данных. Но я не понимаю, почему говорится, что даны неправильные типы данных. Я упускаю какой-либо приоритет или неправильно использую твой паратез? Кто-нибудь может дать мне знать, как мне это исправить?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

(c(1).toInt -> 1) - это не Map (изменяемое или иное), это кортеж.

Но кортеж можно превратить в Map с помощью одной клавиши -> пара значений.

dm += c(0) -> mutable.Map(c(1).toInt -> 1)

Кстати, dm уже изменчив, поэтому нет никаких причин делать его var.


ОБНОВЛЕНИЕ

Если вам нужно обновить (+=) обе карты, тогда вам потребуется опция += на обеих картах.

import scala.collection.mutable

val dm =  //with existing content
  mutable.Map[String, mutable.Map[Int, Int]]("abc" -> mutable.Map(9->9))
  .withDefaultValue(mutable.Map()) //and an empty Map as default

val c = "abc 0".split(" ")
val d = "xyz 5".split(" ")

dm += c(0) -> (dm(c(0)) += (c(1).toInt -> 1))
dm += d(0) -> (dm(d(0)) += (d(1).toInt -> 2))
//Map(xyz -> Map(5 -> 2), abc -> Map(0 -> 1, 9 -> 9))
0 голосов
/ 12 февраля 2020

+= метод принимает тип аргумента (K, V), где K - это тип ключа вашей объявленной изменяемой карты, а V - это значение. Вы видите эту ошибку компиляции, потому что в вашем случае V это mutable.Map[Int,Int], а не (Int, Int), как ваш код объявляет после кортежа.

Итак, что вы хотели бы сделать, это следующее:

var dm = mutable.Map[String, mutable.Map[Int, Int]]()
val c  = s.split(" ") // s = abc 0 -> c(0)=abc, c(1)=0

// get internal Map[Int, Int] or create new one if it does not exists for a key
val valueMap = dm.getOrElse(c(0), mutable.Map.empty[Int, Int])

// Append internal map with tuple of Int's 
valueMap += c(1).toInt -> 1

// Put map back to outer map, for the case if it did not exists before, or override it
dm += c(0) -> valueMap

Правило большого пальца - старайтесь избегать изменяемых структур, насколько это возможно, и вместо этого старайтесь использовать неизменяемые структуры.

Надеюсь, это поможет!

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