首页 > 解决方案 > 元组scala的不可变迭代器映射

问题描述

我有一个元组映射,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中迭代它?

标签: scaladictionaryiteratortuplesimmutability

解决方案


您的数据的 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


推荐阅读