Я попытался это, но он не работает:Как я могу дать неизменяемую карту в Scala?
val map:Map[String,String] = for {
tuple2 <- someList
} yield tuple2._1 -> tuple2._2
Как еще я бы преобразовать список Tuple2s в карте?
Я попытался это, но он не работает:Как я могу дать неизменяемую карту в Scala?
val map:Map[String,String] = for {
tuple2 <- someList
} yield tuple2._1 -> tuple2._2
Как еще я бы преобразовать список Tuple2s в карте?
Моя первая попытка заключается в следующем:
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))
Это не может быть проще:
Map(listOf2Tuples: _*)
с использованием метода apply
в Map
объекта-компаньона.
В Скале 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>
В 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))
Это будет работать для любой коллекции пар. Обратите внимание, что документация имеет это сказать о его дубликата политики:
Повторяющиеся ключи будут перезаписаны позже ключей: если это неупорядоченный сбор, какой ключ находится в результате карта не определена.
Работает только в том случае, если 'listOf2Tuples' является явным, а не переменным/val –
Исправлена ошибка в работе. –
+1, Это ИМО - лучший способ сделать это. :) – missingfaktor