2016-07-11 9 views
0

ich die folgende Variablereduzieren, um eine Liste der Karte von Tupeln

val x1 = List((List(('a',1), ('e',1), ('t',1)),"eat"), (List(('a',1), ('e',1), ('t',1)),"ate")) 

ich ein

List(Map -> List) 

wollen bekommen haben, die etwa wie folgt aussehen wird. Die Idee ist, zu einer Gruppe Wörter b die Zeichen in ihnen enthaltenen

Map(List((a,1), (e,1), (t,1)) -> List(eat, ate)) 

ich verwendet habe, die im Anschluss an diese ganz jedoch zu erreichen, nicht alles richtig machen. Ich habe den folgenden Code ein und erhalten Sie das erwartete Ergebnis

scala> val z1 = x1.groupBy(x => x._1) 
        .map(x => Map(x._1 -> x._2.map(z=>z._2))) 
        .fold(){(a,b) => b} 
z1: Any = Map(List((a,1), (e,1), (t,1)) -> List(eat, ate)) 

jedoch verwendet wird, würde Ich mag die offensichtliche Art Map[List[(Char, Int)],List[String]] und nicht Any zurückzukehren, wie in meinem Fall zurückgeführt wird. Ich frage mich auch, ob es besser ist, die ganze Sache selbst zu machen. Danke vielmals!

Antwort

1

Versuchen Sie dies.

scala> x1.groupBy(_._1).mapValues(_.map(_._2)) 
res2: scala.collection.immutable.Map[List[(Char, Int)],List[String]] = Map(List((a,1), (e,1), (t,1)) -> List(eat, ate)) 

Aber, yeah, ich denke, dass Sie vielleicht Ihre Datendarstellung überdenken möchten. Das List[(List[(Char,Int)], String)] Geschäft ist ziemlich umständlich.

+0

Danke! Lief wie am Schnürchen! Über diese Datenrepräsentation wird 'List [(List [(Char, Int)], String)] aus einem Wörterbuch verschiedener Wörter berechnet. – borarak

+0

Sie könnten die folgende Kanonisierung verwenden: 'val words = Liste (" essen "," gegessen "," billig "," Pfirsich "," Baum ") words.map (w => (w.toLowerCase.sorted .., w)) groupBy (_._ 1) .mapValues ​​(_ Karte (_._ 2)) ' Dies ergibt: ' Karte (AET -> Liste (essen, aß), acehp -> Liste (billig, Pfirsich), eert -> List (Baum)) – Iadams