2015-07-25 2 views
0

я этоКак идиоматически превратить Seq кортежей в карту в scala?

list { 
    1,1 
    1,2 
    2,1 
} 

, и я хочу, чтобы превратить его в этот

map { 
    1 -> (1,2) 
    2 -> (1) 
} 

То, что я пытался до сих пор:

val list = List((1,1),(1,2),(2,1)) 
var map: Map[Int, Seq[Int]] = Map() 

for (e <- list) { 
    if (map contains e._1) 
    map = map + (e._1 -> (map(e._1) :+ e._2)) 
    else 
    map = map + (e._1 -> Seq(e._2)) 
} 

Излишне говорить, похоже, кто-то пролил молоко на мой код. Как улучшить ситуацию?

+0

тесно связана с HTTP://stackoverflow.com/questions/8016750/convert-list-of-tuple-to-map-and-deal-with-duplicate-key. – heenenee

ответ

6

Вы ищете метод .groupBy:

scala> val list = List((1,1),(1,2),(2,1)) 
list: List[(Int, Int)] = List((1,1), (1,2), (2,1)) 

scala> val map = list.groupBy(_._1) 
map: Map[Int,List[(Int, Int)]] = Map(2 -> List((2,1)), 1 -> List((1,1), (1,2))) 

Тогда вам просто необходимо отобразить над значениями и выбрать второй элемент каждой пары:

scala> val map = list.groupBy(_._1).mapValues(_.map(_._2)) 
map: Map[Int,List[Int]] = Map(2 -> List(1), 1 -> List(1, 2)) 
Смежные вопросы