неизменяемая карта итераторов кортежей scala - PullRequest
0 голосов
/ 06 июня 2018

У меня есть карта кортежей в scala, и я хочу получить из нее только что выбранный ключ, пары значений.

Я попытался

val m1 = {"a":{"0":"R","1":null,"2":null,"3":12.25.0,"4":null}
         ,"b":{"0":"R","1":null,"2":null,"3":34.75,"4":null}
         ,"c":{"0":"R","1":null,"2":null,"3":56.25,"4":null}
         ,"d":{"0":"R","1":null,"2":null,"3":45.65,"4":null}
         }

, затем попытался выполнить итерацию.Но я не могу обработать это сложное выражение.

Так как мне просто нужны a и b, результат будет

a-> 12.25

d-> 45.65

как я могу выполнить его в scala?

1 Ответ

0 голосов
/ 06 июня 2018

Эквивалент ваших данных в Scala выглядит следующим образом:

val m1: List[(String, List[(String, Any)])] =
  List("a" -> List("0" -> "R", "1" -> null, "2" -> null, "3" -> 12.25, "4" -> null),
       "b" -> List("0" -> "R", "1" -> null, "2" -> null, "3" -> 34.75, "4" -> null),
       "c" -> List("0" -> "R", "1" -> null, "2" -> null, "3" -> 56.25, "4" -> null),
       "d" -> List("0" -> "R", "1" -> null, "2" -> null, "3" -> 45.65, "4" -> null))

Получив данные в этом формате, вы можете извлечь нужные данные следующим образом:

val keys = List("a", "d")
val field = 3

m1.collect{ case (k, v) if keys.contains(k) => (k, v(field)._2) }

Если порядок данных не имеет значения, вы можете использовать Map вместо List, а код будет немного чище:

val field = "3"

m1.collect{ case (k, v) if keys.contains(k) => (k, v(field)) }

Это также позволит вам удалить значения nullи избегайте использования Any

...