2016-11-28 1 views
1

У меня есть listMap1 переменную типа List [Map [String, String]], и я хочу, чтобы все значения, связанные с ключом «k1» в одну строку с разделителями значений, разделенныхКак получить значения, разделенные запятой, из списка карт в Scala?

import fiddle.Fiddle, Fiddle.println 
import scalajs.js 

@js.annotation.JSExport 
object ScalaFiddle { 

    var m1:Map[String,String] = Map(("k1"->"v1"), ("k2"->"vv1")) 
    var m2:Map[String,String] = Map(("k1"->"v2"),("k2"->"vv2")) 
    var m3:Map[String,String] = Map(("k1"->"v3"),("k2"->"vv3")) 

    var listMap1 = List(m1,m2,m3) 
    var valList = ?? // need all values assoicated with k1 like --> v1,v2,v3... 
} 

ответ

7

Простой подход был бы:

listMap1.flatMap(_.get("k1")).mkString(",") 

быть предупреждены, что это не будет работать, если вы генерируете данные CSV и соответствующие значения содержат , s например Map(("k1" -> "\some, string"))

+0

Из любопытства. Производительность, плоская карта быстрее, чем использование фильтра + карты ??? – Pavel

+1

@Pavel - я бы предположил, что «flatMap» выполняется быстрее, так как для этого требуется только один ключевой поиск и создается только один промежуточный список вместо двух. – Lee

+1

Существует также старый режим ожидания для лучшей производительности, избегая любых промежуточных списков вообще: 'listMap1.iterator.flatMap (_. Get (" k1 "). Iterator) .mkString (", ")'. –

1

это нормально ??

val r = listMap1.filter(l => l.contains("k1")).map(r => r("k1")).mkString(",") 
+0

Возможно, более короткая форма с '_':' listMap1.filter (_. Содержит ("k1")) .map (_ ("k1")) .mkString (",") '. – Suma

+0

Сильно подозреваем, что решение flatMap быстрее :)) Работа фильтра дополнительно O (n)? в этом конкретном случае. – Pavel

+0

Вы всегда можете использовать представление, чтобы избежать промежуточного распределения коллекций. –