2010-05-04 3 views

ответ

10

Моя первая попытка заключается в следующем:

scala> val country2capitalList = List("England" -> "London", "Germany" -> "Berlin") 
country2capitalList: List[(java.lang.String, java.lang.String)] = List((England,London), (Germany,Berlin)) 

scala> val country2capitalMap = country2capital.groupBy(e => e._1).map(e => (e._1, e._2(0)._2)) 
country2capitalMap: scala.collection.Map[java.lang.String,java.lang.String] = Map(England -> London, Germany -> Berlin) 

Но вот лучшее решение:

scala> val betterConversion = Map(country2capitalList:_*) 
betterConversion: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(England -> London, Germany -> Berlin) 

:_* необходимо дать компилятору подсказку использовать список в качестве списков параметров аргумента. В противном случае это даст вам:

scala> Map(country2capitalList) 
<console>:6: error: type mismatch; 
found : List[(java.lang.String, java.lang.String)] 
required: (?, ?) 
     Map(country2capitalList) 
     ^

От Scala 2.8 на вы можете использовать toMap:

scala> val someList = List((1, "one"), (2, "two")) 
someList: List[(Int, java.lang.String)] = List((1,one), (2,two)) 

scala> someList.toMap 
res0: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two)) 
14

Это не может быть проще:

Map(listOf2Tuples: _*) 

с использованием метода apply в Map объекта-компаньона.

+0

Работает только в том случае, если 'listOf2Tuples' является явным, а не переменным/val –

+0

Исправлена ​​ошибка в работе. –

+0

+1, Это ИМО - лучший способ сделать это. :) – missingfaktor

7

В Скале 2.8:

scala> import scala.collection.breakOut 
import scala.collection.breakOut 

scala> val ls = List("a","bb","ccc") 
ls: List[java.lang.String] = List(a, bb, ccc) 

scala> val map: Map[String,Int] = ls.map{ s => (s,s.length) }(breakOut) 
map: Map[String,Int] = Map((a,1), (bb,2), (ccc,3)) 

scala> val map2: Map[String,Int] = ls.map{ s => (s,s.length) }.toMap 
map2: Map[String,Int] = Map((a,1), (bb,2), (ccc,3)) 

scala> 
9

В 2.8, вы можете использовать метод toMap:

scala> val someList = List((1, "one"), (2, "two")) 
someList: List[(Int, java.lang.String)] = List((1,one), (2,two)) 

scala> someList.toMap 
res0: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two)) 

Это будет работать для любой коллекции пар. Обратите внимание, что документация имеет это сказать о его дубликата политики:

Повторяющиеся ключи будут перезаписаны позже ключей: если это неупорядоченный сбор, какой ключ находится в результате карта не определена.

 Смежные вопросы

  • Нет связанных вопросов^_^