2014-09-20 74 views
0

我有以下字符串,我想使用Scala的如何使用scala分割字符串?

"myInfo": "myName-name;model-R210;" 

我想分割MyInfo的字符串值,这样我可以seperately访问MYNAME并将其值改为拆呢。 例如MYNAME:名称,型号:R210等

我使用下面的代码,以分割字符串 -

(mainString \ "myInfo").as[String].split("\\;").toList.map(_.split("\\-")) 

其中mainString是JSON和包含 'MyInfo的' 键值对。

如何将字符串拆分为' - '并进行访问?

+0

你是什么意思“访问我的名字和它的价值”?你想保持它们在元组中吗?像'((myName,name),(model,R210))'? – 2014-09-20 10:34:05

+0

Ende Neu – Vishwas 2014-09-20 10:39:16

回答

4

您可以获得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") 
+0

正是我想要的..如何从列表中访问'myName'? – Vishwas 2014-09-20 10:43:43

+0

如果我不想使用.getOrElse方法 – Vishwas 2014-09-23 07:38:50

+0

如果我不想使用.getOrElse方法怎么办?我有一个包含整数字段的字段。当我使用data.get(“cNumber”)时,它返回字符串。有什么办法可以返回Int值 – Vishwas 2014-09-23 08:18:31

0

首先,对谁编码的复杂的数据结构为JSON文档中的字符串耻辱;你根本不需要解析它。如果这是你的控制之下,我会改变,要像

"myInfo": { 
    "myName": "name", 
    "model": "R210" 
} 

但是,如果你不能改变输入,然后就这样做是为了得到你想要的地图:

val myInfo = ((mainString \ "myInfo").as[String] split ';' map (_ split '-') collect { case Array(k,v) => k->v }).toMap 

无需要从中间结果中创建列表 - 这只会减慢速度。并且只是在一个Char上进行分割,而不是一个String(它将被编译为一个正则表达式)。

请注意,collect会导致任何不带连字符或多个连字符的组件被忽略;你可能想在那里做点别的。