如何使用scala拆分字符串?
Posted
技术标签:
【中文标题】如何使用scala拆分字符串?【英文标题】:How to split string using scala? 【发布时间】:2014-09-20 10:11:03 【问题描述】:我有一个以下字符串,我想使用 scala 拆分它
"myInfo": "myName-name;model-R210;"
我想拆分 myInfo 字符串的值,以便我可以单独访问 myName 及其值。 例如我的名字:名称,型号:R210 等
我正在使用以下代码来拆分字符串 -
(mainString \ "myInfo").as[String].split("\\;").toList.map(_.split("\\-"))
其中 mainString 是 Json 并包含“myInfo”键值对。
如何拆分字符串以用'-'分隔并访问它?
【问题讨论】:
access myName and its value seperately
是什么意思?你想把它们保存在元组中吗?喜欢((myName, name), (model, R210))
?
【参考方案1】:
您可以像这样获得Map[String,String]
:
val data: Map[String,String] = (mainString \ "myInfo").as[String]
.split("\\;").map(_.split("\\-").toList)
.collect
case key :: value :: _ => key -> value
.toMap
然后访问您的值:
val name = data.getOrElse("myName", "DefaultNameIfMissing")
【讨论】:
正是我想要的......我如何从该列表中访问“myName”? 如果我不想使用 .getOrElse 方法怎么办 如果我不想使用 .getOrElse 方法怎么办。我有一个包含整数字段的字段。当我使用 data.get("cNumber") 时,它返回字符串。有什么方法可以返回 Int 值 @Vishwas:我建议您阅读 Scala 的Map
和 Option
类型,并在必要时提出另一个问题。如果你想要来自 Map[String,String]
的 int,你可以执行类似 data.get("someInt").map(_.toInt).getOrElse(0)
的操作。
嗨@Mikesname 我正在使用类似的策略将我的文件字符串拆分为对象映射,请参阅Scala immutable Map slow。但是真的很慢。如果我们转换为 Array[(String, String)] 会更快吗?【参考方案2】:
首先,对将复杂数据结构编码为 JSON 文档中的字符串的人感到羞耻;您根本不必解析它。如果它在您的控制之下,我会将其更改为类似
"myInfo":
"myName": "name",
"model": "R210"
但是如果你不能改变输入,那么就这样做来得到你想要的地图:
val myInfo = ((mainString \ "myInfo").as[String] split ';' map (_ split '-') collect case Array(k,v) => k->v ).toMap
无需根据中间结果创建列表——这只会减慢速度。并且只是在一个字符上拆分,而不是一个字符串(它将被编译为正则表达式)。
请注意,collect
会导致忽略任何没有连字符或多个连字符的组件;你可能想在那里做点别的事情。
【讨论】:
以上是关于如何使用scala拆分字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spark Scala 数据框中拆分逗号分隔的字符串并获取 n 个值?