我有这个工作代码在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看起来势在必行.是否有更多功能性方法可以隐藏用户?
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创建了一个惰性集合,因此在按键访问同一元素的情况下可能会出现性能问题.