2016-06-07 2 views
0

У меня есть список списков в Scala, который выглядит вот так: List(List(1, 5, 6, 10), List(1, 6), List(1, 3, 10), я хочу преобразовать в HashMap[Int, List[Int]], где первый Int - это индекс каждого списка, а List[Int] - это список. В конце концов HashMap должен выглядетьСписок списков в HashMap [Index of List] -> List - Scala

HashMap[Int, List[Int]](
     0 -> List(1, 5, 6, 10), 
     1 -> List(1, 6), 
     2 -> List (1, 3, 10),) 

Вот мой подход, есть список 0 к длине списка и почтовый его с помощью этого вложенного списка, а затем каким-то образом превратить его в HashMap. Но я ищу что-то более идиоматичное или опрятное. Есть идеи?

ответ

3

zipWithIndex с map должен это сделать:

scala> val a = List(List(1, 5, 6, 10), List(1, 6), List(1, 3, 10)) 
a: List[List[Int]] = List(List(1, 5, 6, 10), List(1, 6), List(1, 3, 10)) 

scala> a.zipWithIndex.map(_.swap).toMap 
res0: scala.collection.immutable.Map[Int,List[Int]] = 
Map(
    0 -> List(1, 5, 6, 10), 
    1 -> List(1, 6), 
    2 -> List(1, 3, 10) 
) 

Edit:

Если вы абсолютно нужен HashMap, вещи немного хаотичным:

scala> val a = List(List(1, 5, 6, 10), List(1, 6), List(1, 3, 10)) 
a: List[List[Int]] = List(List(1, 5, 6, 10), List(1, 6), List(1, 3, 10)) 

scala> val b = a.zipWithIndex.map(_.swap) 
b: List[(Int, List[Int])] = List((0,List(1, 5, 6, 10)), (1,List(1, 6)), (2,List(1, 3, 10))) 

scala> val hM = collection.immutable.HashMap[Int, List[Int]](b: _*) 
hM: scala.collection.immutable.HashMap[Int,List[Int]] = 
Map(
    0 -> List(1, 5, 6, 10), 
    1 -> List(1, 6), 
    2 -> List(1, 3, 10) 
) 
+2

использование '_ .swap' вместо 'x => (x._2, x._1)' – Kolmar

+0

Добавлено, я должен буду это помнить! –

+0

Очень приятно. Есть ли способ конвертировать его в HashMap вместо Map. Моя функция жалуется на ожидаемый HashMap [Int, List [Int]], фактический: Map [Int, List [Int]]. –