user866364
user866364

Reputation:

How to convert keys in a Map to lower case?

I have a map where the key is a String and I need to change every key to lower case before work with this map.

How can I do it in Scala? I was thinking something like:

var newMap = scala.collection.mutable.Map[String, String]()
data.foreach(d => newMap +=(d._1.toLowerCase -> d._2))   

What is the best approach for it? Thanks in advance.

Upvotes: 11

Views: 15029

Answers (2)

Gregor Raýman
Gregor Raýman

Reputation: 3081

Your approach would work, but in general in Scala for this kind of transformation the immutable variants of the collections are preferred.

You can use the map method of the Map class with the following one liner:

val m = Map("a"->"A", "B"->"b1", "b"->"B2", "C"->"c")
m.map(e=>(e._1.toLowerCase,e._2))

Upvotes: 4

Michael Zajac
Michael Zajac

Reputation: 55569

The problem here is that you're trying to add the lower-cased keys to the mutable Map, which is just going to pile additional keys into it. It would be better to just use a strict map here, rather than a side-effecting function.

val data = scala.collection.mutable.Map[String, String]("A" -> "1", "Bb" -> "aaa")
val newData = data.map { case (key, value) => key.toLowerCase -> value }

If you really want to do it in a mutable way, then you have to remove the old keys.

data.foreach { case (key, value) =>
    data -= key
    data += key.toLowerCase -> value
}

scala> data
res79: scala.collection.mutable.Map[String,String] = Map(bb -> aaa, a -> 1)

Upvotes: 10

Related Questions