Thirdman
Thirdman

Reputation: 709

HowTo get a Map from a csv string

I'm fairly new to Scala, but I'm doing my exercises now.
I have a string like

"A>Augsburg;B>Berlin"
. What I want at the end is a map

val mymap = Map("A"->"Augsburg", "B"->"Berlin")

What I did is:

val st = locations.split(";").map(dynamicListExtract _)
with the function
private def dynamicListExtract(input: String)  = {
    if (input contains ">") {
      val split = input split ">"
      Some(split(0), split(1)) // return key , value
    } else {
      None 
    } 
  }
Now I have an
Array[Option[(String, String)
How do I elegantly convert this into a Map[String, String]

Can anybody help? Thanks

Upvotes: 6

Views: 7247

Answers (5)

Landei
Landei

Reputation: 54584

val str= "A>Augsburg;B>Berlin"

Map(str.split(";").map(_ split ">").map(s => (s(0),s(1))):_*)

--or--

str.split(";").map(_ split ">").foldLeft(Map[String,String]())((m,s) => m + (s(0) -> s(1)))

Upvotes: 0

hbatista
hbatista

Reputation: 1237

A simple solution (not handling error cases):

val str = "A>Aus;B>Ber"
var map = Map[String,String]()

str.split(";").map(_.split(">")).foreach(a=>map += a(0) -> a(1))

but Ben Lings' is better.

Upvotes: 0

Ben Lings
Ben Lings

Reputation: 29403

In 2.8, you can do this:

val locations = "A>Augsburg;B>Berlin"
val result = locations.split(";").map(_ split ">") collect { case Array(k, v) => (k, v) } toMap

collect is like map but also filters values that aren't defined in the partial function. toMap will create a Map from a Traversable as long as it's a Traversable[(K, V)].

Upvotes: 9

Dave Griffith
Dave Griffith

Reputation: 20515

It's also worth seeing Randall's solution in for-comprehension form, which might be clearer, or at least give you a better idea of what flatMap is doing.

Map.empty ++ (for(possiblePair<-sPairs.split(";"); pair<-dynamicListExtract(possiblePair)) yield pair)

Upvotes: 3

Randall Schulz
Randall Schulz

Reputation: 26486

Just change your map call to flatMap:

scala> sPairs.split(";").flatMap(dynamicListExtract _)
res1: Array[(java.lang.String, java.lang.String)] = Array((A,Augsburg), (B,Berlin))

scala> Map(sPairs.split(";").flatMap(dynamicListExtract _): _*)
res2: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((A,Augsburg), (B,Berlin))

For comparison:

scala> Map("A" -> "Augsburg", "B" -> "Berlin")
res3: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((A,Augsburg), (B,Berlin))

Upvotes: 12

Related Questions