2017-10-27 5 views
0

Hallo Erstellen habe eine Zeichenfolge und die, falls das Format der Zeichenfolge wird im folgenden genannt:Scala- Karte von String

val str = "{a=10, b=20, c=30}" 

die alle Parameter innerhalb dieser Zeichenfolge durch Komma und Leerzeichen einzigartig und getrennt ist. Auch Dieser String beginnt immer mit '{' und endet mit '}'. Ich mag wie unten eine Karte aus dieser Zeichenfolge, etwas schaffen:

val values = Map("a" -> 10, "b" -> 20, "c" -> 30) 

Was ist der effizienteste Weg, ich dies erreichen kann?

Antwort

1

Verwenden regex kann dies einfach erreichen:

"(\\w+)=(\\w+)".r.findAllIn("{a=10, b=20, c=30}").matchData.map(i => { 
    (i.group(1), i.group(2)) 
    }).toMap 
0

Die Funktion, die Sie schreiben wollen ist ziemlich einfach:

def convert(str : String) : Map[String, String] = { 
    str.drop(1).dropRight(1).split(", ").map(_.split("=")).map(arr => arr(0)->arr(1)).toMap 
} 

mit drop und dropRight, um die Klammern zu entfernen. Dann teilen Sie die Zeichenfolge mit dem Ausdruck ,, was zu mehreren Strings führt.

Dann teilen Sie jeden dieser Strings, was zu Arrays mit zwei Elementen führt. Diese werden verwendet, um eine Karte zu erstellen.

1
scala> val str = "{a=10, b=20, c=30}" 
str: String = {a=10, b=20, c=30} 

scala> val P = """.*(\w+)=(\d+).*""".r 
P: scala.util.matching.Regex = .*(\w+)=(\d+).* 

scala> str.split(',').map{ case P(k, v) => (k, v.toInt) }.toMap 
res2: scala.collection.immutable.Map[String,Int] = Map(a -> 10, b -> 20, c -> 30) 
0

Ich würde es tun, gefällt das (ich glaube, regex nicht hier ist erforderlich):

val str = "{a=10, b=20, c=30}" 

val values: Map[String, Int] = str.drop(1).dropRight(1) // drop braces 
    .split(",") // split into key-value pairs 
    .map { pair => 
    val Array(k, v) = pair.split("=") // split key-value pair and parse to Int 
    (k.trim -> v.toInt) 
}.toMap