Как обновить значение изменяемой карты, которая является значением ключа основной карты? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть изменяемая Карта в Scala, которая определяется следующим образом:

scala> var sm = mutable.Map[String, mutable.Map[Int, Int]]()
sm: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map()

У меня есть Карта, в которой в качестве значения используется другая Карта, и вставлены значения, как показано ниже.

scala> sm += ("abc" -> mutable.Map(1->0,0->0))
res77: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(abc -> Map(1 -> 0, 0 -> 0))

scala> sm
res78: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(abc -> Map(1 -> 0, 0 -> 0))

У меня есть "ab c" из другого файла со значением 0 или 1, которое мне нужно проверить и получить счетчик 0 и 1 и обновить его на карте sm. Перед проверкой я попытался обновить значения в scala REPL, как показано ниже

scala> sm += ("abc" -> (1 -> sm("abc")(1)+1))
<console>:27: error: type mismatch;
 found   : Int(1)
 required: String
       sm += ("abc" -> (1 -> sm("abc")(1)+1))

Поэтому я попытался сначала получить доступ к ключу "abc"->1, используя sm("abc")(1), который дал мне правильное значение 0 и добавил к нему значение, которое также хорошо работало.

scala> sm("abc")(1)+2
res90: Int = 2

Но когда я подставляю то же выражение sm("abc")(1) на карте sm, чтобы обновить значение sm("abc")(1), я вижу сообщение об ошибке:

scala> sm += ("abc" -> (1 -> sm("abc")(1)+2))
<console>:27: error: type mismatch;
 found   : Int(2)
 required: String
       sm += ("abc" -> (1 -> sm("abc")(1)+2))
scala> var e = sm("abc")(1)+2
e: Int = 2

scala> sm += ("abc" -> (1 -> e ))
<console>:29: error: type mismatch;
 found   : (Int, Int)
 required: scala.collection.mutable.Map[Int,Int]
       sm += ("abc" -> (1 -> e ))

Это работает sm += ("abc" -> mutable.Map(1 -> e )), но заменяет ключ 0 и приводит к

scala> sm += ("abc" -> mutable.Map(1 -> e ))
res93: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(abc -> Map(1 -> 2))

Я не могу понять это сообщение об ошибке. Может кто-нибудь сообщить мне, в чем заключается ошибка, которую я здесь делаю, и как я могу обновить значение карты -> значение карты и получить вывод в виде

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

1 Ответ

0 голосов
/ 11 февраля 2020

Есть несколько проблем с вашим кодом:

  1. -> имеет более высокий приоритет, чем +, поэтому ваш код по существу:

    (1 -> sm("abc")(1)) + 2
    

    Чтобы сделать эту работу, поставьте круглые скобки вокруг плюс:

    1 -> (sm("abc")(1) + 2)
    

    Тогда это выдаст вам ту же ошибку, что и (Int, Int).

  2. Неявного преобразования из кортеж (-> создает кортеж) для сопоставления, поэтому вам нужно использовать явный конструктор.

В итоге рабочий код вашей версии:

sm += ("abc" -> mutable.Map(1 -> (sm("abc")(1) + 2) ) )

Однако это не очень хорошая практика. Вы уже определили значение как изменчивую карту, поэтому вам не нужно создавать новую карту каждый раз, когда вы обновляете значение. Плюс ваша версия тоже потеряет пару 0 -> 0. Вы можете просто сделать:

sm("abc")(1) = sm("abc")(1) + 2

sm тогда будет Map(abc -> Map(1 -> 2, 0 -> 0))

Еще один способ решить эту проблему с помощью неизменной карты. Есть много обучающих программ этого онлайн, поэтому я не буду повторяться здесь.

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