【问题标题】:How to split string using scala?如何使用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))

标签: string scala split


【解决方案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 会导致忽略任何没有连字符或多个连字符的组件;你可能想在那里做点别的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 2011-06-30
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多