什么是创建列表地图的更实用的方法?

mpa*_*raz 0 scala

我有这个工作代码在String中的字符和包含索引的List之间创建Map.

scala> "Lollipop".zipWithIndex.foldLeft(Map[Char, List[Int]]())((acc, t) => acc + (t._1 -> (acc.getOrElse(t._1, List[Int]()) :+ t._2)))
res122: scala.collection.immutable.Map[Char,List[Int]] = Map(i -> List(4), L -> List(0), l -> List(2, 3), p -> List(5, 7), o -> List(1, 6))
Run Code Online (Sandbox Code Playgroud)

但使用acc.getOrElse看起来势在必行.是否有更多功能性方法可以隐藏用户?

sen*_*nia 5

for {
  (c, l) <- "Lollipop".zipWithIndex.groupBy{ _._1 }
} yield c -> l.map{ _._2 }
// Map(i -> Vector(4), L -> Vector(0), l -> Vector(2, 3), p -> Vector(5, 7), o -> Vector(1, 6))
Run Code Online (Sandbox Code Playgroud)

之后groupBy{ _._1 }你会得到一个Map[Char, Seq[(Char, Int)]].所以你必须将对转换(Char, Int)Int,使用p => p._2或只是_._2.

你可以mapValues像这样使用:

"Lollipop".zipWithIndex.groupBy{ _._1 }.mapValues{ _.map{_._2} }
Run Code Online (Sandbox Code Playgroud)

但是mapValues创建了一个惰性集合,因此在按键访问同一元素的情况下可能会出现性能问题.