scala - 元组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中迭代它?
解决方案
您的数据的 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
推荐阅读
- sendgrid - Mailjet/Sendgrid:发送正文中带有冒号的电子邮件显示“无内容”
- swift - swift5 - 枚举协议 - 自我和自我以及一个变量
- c# - EF 嵌套/非嵌套上下文处理和解决方案
- php - 命令到处理程序以在 DDD 和 CQRS 中聚合根到存储库流
- python - PulpSolverError: Pulp: 执行 C:\Users\ipeki\anaconda3\lib\site-packages\pulp\apis\..\solverdir\cbc\win\64\cbc.exe 时出错
- git - 在提交更改时出现以下错误
- java - 从智能合约交易中获取解码输出
- c# - 使用该方法开发 C# 代码。开发一个单元测试以验证该方法是否有效
- javascript - 如何将具有多个值的对象添加到数组中?
- vue.js - Vue JS:注销后执行 router.push() 方法时,表单没有被清除