Как взломать карту в Scala и сохранить ключ в точке останова - PullRequest
0 голосов
/ 20 сентября 2019

Итак, у меня есть вложенная карта в scala Map[Int, Map[String, Double]], и мне нужно перебрать внешнюю карту, и для каждого целого нужно проверить, содержит ли набор ключей внутренней карты определенную строку.если нет, то мне нужно прерваться в этой точке и вернуть ключ другой f внешней карты, на которой содержится сбой

Например,

  myMap = Map( (1, Map ("a" -> 13.0,"b" ->12.0 )),(2, Map ("a"-> 12.0, "b"-> 13.0)), (3, Map ("a" -> 11.0,"c" ->12.0 )),(4, Map ("e" -> 11.0,"d" ->12.0 )))

Я хочу первое вхождение, когда внутренняя карта не имеетkey = b Таким образом, мой вывод для вышеупомянутого должен быть 3

Ответы [ 3 ]

1 голос
/ 20 сентября 2019

Мне нужно перебрать внешнюю карту и сделать [...] разрыв в этой точке

Карта является коллекцией и имеет .find():

Находит первый элемент коллекции, удовлетворяющий предикату, если таковой имеется.

(Обратите внимание, что «элементами» карт являются кортежи (key, value), и вам необходимо _2чтобы добраться до внутренней карты).

Предикат внутри

проверяет, содержит ли набор ключей внутренней карты определенную строку

Это .contains().

Проверяет, содержит ли эта карта привязку для ключа.

Соединение и добавление _1 для получения ключа, который не удалсятест внутренней карты:

myMap.find(_._2.contains("particular string")).map(_._1)
0 голосов
/ 20 сентября 2019

Вы можете использовать dropWhile

val myMap = Map(
  (1, Map ("a" -> 13.0,"b" ->12.0 )),
  (2, Map ("a"-> 12.0, "b"-> 13.0)),
  (3, Map ("a" -> 11.0,"c" ->12.0 )),
  (4, Map ("e" -> 11.0,"d" ->12.0 )))

var missingValue = myMap.dropWhile(_._2.contains("b")).headOption
0 голосов
/ 20 сентября 2019

Хорошим вариантом является использование collectFirst:

myMap.collectFirst { case (k, v) if !v.contains("b") => k }

Это возвращает Option[Int], что дает Some(3) в вашем примере.Это будет None, если тест не пройден для всех элементов на карте


Это решение для дополнительного вопроса в вашем комментарии:

val testKeys = List("a", "b", "c").toSet

myMap.collectFirst { case (k, v) if !v.keys.forall(testKeys.contains) => k }

Это дает Some(4)

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