Eu estava pensando em uma boa maneira de converter uma lista de tupla com chave duplicada [("a","b"),("c","d"),("a","f")]
em um mapa ("a" -> ["b", "f"], "c" -> ["d"])
. Normalmente (em python), eu criaria um mapa vazio e faria um loop for sobre a lista e verificaria se há chaves duplicadas. Mas estou procurando uma solução mais escalonada e inteligente aqui.
btw, o tipo real de valor-chave que uso aqui é (Int, Node)
e quero transformar em um mapa de(Int -> NodeSeq)
Map[String, SeqView[String,Seq[_]]]
... isso é intencional?SeqView[String,Seq[_]]
também é umSeq[String]
. Ainda em retrospectiva, não acho que valha a pena, então removi oview
.mapValues
fará uma visão de qualquer maneira sobre os valores.x.groupBy(_._1).mapValues(_.map(_._2)).map(identity)
porque amapValues
expressão será recomputada cada vez que for usada. Veja issues.scala-lang.org/browse/SI-7005Para Googlers que se preocupam com duplicatas:
fonte
A partir
Scala 2.13
, a maioria das colecções são fornecidos com o groupMap método é que (como o nome sugere) um equivalente (mais eficaz) de umgroupBy
seguido pormapValues
:Este:
group
s elementos baseados na primeira parte das tuplas (grupo parte do grupo Mapa)map
s valores agrupados tomando a sua segunda parte tuplo (mapear parte do grupo Mapa )Isso é equivalente,
list.groupBy(_._1).mapValues(_.map(_._2))
mas executado em uma passagem pela Lista.fonte
Esta é uma maneira mais idiomática do Scala de converter uma lista de tuplas em um mapa que manipula chaves duplicadas. Você deseja usar uma dobra.
fonte
Abaixo você pode encontrar algumas soluções. (GroupBy, FoldLeft, Aggregate, Spark)
Variação GroupBy
Variação dobra para a esquerda
Variação agregada - semelhante à dobra esquerda
Variação do Spark - Para conjuntos de dados grandes (conversão para um RDD e para um mapa simples de RDD)
fonte
Você pode tentar isso
fonte