1

があり、List(List("aba, 4"), List("baa, 2"))それをマップに変換したい:

val map : Map[String, Int] = Map("aba" -> 4, "baa" -> 2)

これをアーカイブする最良の方法は何ですか?

アップデート:

データベース クエリを実行してデータを取得します: val (_, myData) = DB.runQuery(...)

これは Pair を返しますが、私が興味があるのは 2 番目の部分だけです。

myData: List[List[String]] = List(List(Hello, 19), List(World, 14), List(Foo, 13), List(Bar, 13), List(Bar, 12), List(Baz, 12), List(Baz, 11), ...)
4

4 に答える 4

8
scala> val pat = """\((.*),\s*(.*)\)""".r
pat: scala.util.matching.Regex = \((.*),\s*(.*)\)

scala> list.flatten.map{case pat(k, v) => k -> v.toInt }.toMap
res1: scala.collection.immutable.Map[String,Int] = Map(aba -> 4, baa -> 2)
于 2012-04-08T13:42:38.537 に答える
4

さらに別の見方:

List(List("aba, 4"), List("baa, 2")).
  flatten.par.collect(
    _.split(",").toList match {
      case k :: v :: Nil => (k, v.trim.toInt) 
  }).toMap

他の回答との違い:

  • ペアの作成を並列化するために使用.parします。これにより、複数のコアから利益を得ることができます。
  • collectaを使用して、 PartialFunction「キー、値」の形式ではない文字列を無視します

編集:以前の回答状態として注文を破棄.parしません。リスト処理の実行順序についてのみ保証がないため、関数は副作用のないものにする必要があります (または、副作用が順序を気にしないようにする必要があります)。

于 2012-04-08T13:01:02.097 に答える
1
List(List("aba, 4"), List("baa, 2")).
  flatten.     //get rid of those weird inner Lists
  map {s=> 
    //split into key and value
    //Array extractor guarantees we get exactly 2 matches
    val Array(k,v) = s.split(","); 
    //make a tuple out of the splits
    (k, v.trim.toInt)}.
  toMap  // turns an collection of tuples into a map
于 2012-04-08T12:27:59.900 に答える
1

私の見解:

List(List("aba, 4"), List("baa, 2")) map {_.head} map {itemList => itemList split ",\\s*"} map {itemArr => (itemArr(0), itemArr(1).toInt)} toMap

手順:

List(List("aba, 4"), List("baa, 2")).
  map(_.head).                                    //List("aba, 4", "baa, 2")
  map(itemList => itemList split ",\\s*").        //List(Array("aba", "4"), Array("baa", "2"))
  map(itemArr => (itemArr(0), itemArr(1).toInt)). //List(("aba", 4), ("baa", 2))
  toMap                                           //Map("aba" -> 4, "baa" -> 2)

あなたの入力データ構造は少しぎこちないので、それを最適化/短縮することはできないと思います。

于 2012-04-08T11:26:32.190 に答える