如何使用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 的 MapOption 类型,并在必要时提出另一个问题。如果你想要来自 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 个值?

如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符

Scala:我如何根据行数将数据帧拆分为多个 csv 文件

如何在Scala中按另一个列表拆分列表

Spark Scala - 拆分字符串语法问题

如何在模式匹配中拆分列表?