2014-09-20 277 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會導致任何不帶連字符或多個連字符的組件被忽略;你可能想在那裏做點別的。