2017-04-10 6 views
0

Ich bin neu in Scala, also kämpfe ich ein bisschen mit Karten.Scala Seq [Objekt] in Karte umwandeln [String, Map [String, String]]

Ich habe

val items = Seq[MyModel] 

wo MyModel (von Java kam) enthält getLang, getName und getMessage Methoden.

Jetzt muss ich die

var loadedMessagesMap: Map[String, Map[String, String]] = ListMap.empty 

füllen Werte von lang in Struktur gruppiert enthalten: lang -> (Name -> Meldung). Name Eigenschaft ist einzigartig. Danke.

Antwort

2

Vielleicht wird dies Ihnen helfen:

val result: Map[String, Map[String, Seq[String]]] = items.groupBy(_.getLang).map { 
    case(lang, models) => 
    lang -> models.groupBy(_.getName).mapValues(_.map(_.getMessage)) 
} 

Es hat eine Seq[String] gibt, weil es möglicherweise mehrere Nachrichten für die gleiche Sprache und Name. Nicht sicher, wie Sie mit diesem Fall umgehen möchten.

+0

Danke. Dahin kommen. Ich muss nicht auf mehrere Nachrichten für dieselbe Sprache/Name achten. Dieser Fall wird nicht passieren (und sie kümmern sich auch nicht darum im FW-Backend). Ich habe 'models.groupBy (_. GetName) .mapValues ​​(_. Map (_. GetMessage) .last)' als dritte Zeile, aber ich denke, es ist nicht die beste Lösung :-) –

+0

@LukasJelinek Es ist in Ordnung. Sie können .last oder .head verwenden, um eine Nachricht aus der Liste zu erhalten, wenn Sie sicher sind, dass die Liste nicht leer ist. – nmat

0

Dies sollte den Trick:

val models: Seq[MyModel] = ??? 
val mapped = models.map { model => 
    model.getLang -> Map(model.getName -> model.getMessage) 
}.toMap 

Ich hoffe, das Ihnen hilft.

+0

Danke, ich komme nur können Sie mir helfen, wie das zu vermeiden? Typ stimmt nicht überein; gefunden: scala.collection.immutable.Map [String, (String, String)], erforderlich: Map [String, Map [String, String]]. Ich muss den Wert in: Map [String, Map [String, String]] zurückgeben. Sorry, Neuling :-) –

+0

Hmm, willst du also auch nach Namen gruppieren? Sie erhalten den Fehler, weil ich dort tatsächlich eine Zuordnung von Zeichenketten zu Tupeln erstellt habe. –

+0

Ich habe die Antwort jetzt bearbeitet, es sollte den Trick machen; lass es mich wissen, wenn das ist, was du suchst :) –

Verwandte Themen