Чтобы получить грубый эквивалент .groupBy()
в ListMap
, вы можете fold
над своей коллекцией. Проблема в том, что ListMap
сохраняет порядок элементов в том виде, в котором они были добавлены, а не в том виде, в котором они встречались.
import collection.immutable.ListMap
List('a','b','a','c').foldLeft(ListMap.empty[Char,Seq[Char]]){
case (lm,c) => lm.updated(c, c +: lm.getOrElse(c, Seq()))
}
//res0: ListMap[Char,Seq[Char]] = ListMap(b -> Seq(b), a -> Seq(a, a), c -> Seq(c))
Чтобы это исправить, вы можете foldRight
вместо foldLeft
. Результатом является исходный порядок элементов при сканировании (сканирование слева направо), но в обратном порядке .
List('a','b','a','c').foldRight(ListMap.empty[Char,Seq[Char]]){
case (c,lm) => lm.updated(c, c +: lm.getOrElse(c, Seq()))
}
//res1: ListMap[Char,Seq[Char]] = ListMap(c -> Seq(c), b -> Seq(b), a -> Seq(a, a))
Это не обязательно плохо, поскольку ListMap
более эффективен с last
и init
ops, O (1), чем с head
и tail
ops, O (n ).
Для обработки ListMap
в исходном порядке слева направо вы можете .toList
и .reverse
it.
List('a','b','a','c').foldRight(ListMap.empty[Char,Seq[Char]]){
case (c,lm) => lm.updated(c, c +: lm.getOrElse(c, Seq()))
}.toList.reverse
//res2: List[(Char, Seq[Char])] = List((a,Seq(a, a)), (b,Seq(b)), (c,Seq(c)))