2017-02-23 2 views
0

Ich versuche, ein Seq [Objekt] mit Objekten durch eine Map [objectid: String, Int] zu filtern, wobei die Object.id ein Schlüssel in der Map ist.Wie kann man ein Seq [Objekt] am besten mit einer Map [String, Int] in Scala filtern?

Ich möchte eine neue Map zurückgeben, die nur die Objekte enthält, deren IDs sich in der ursprünglichen Map mit ihren Int-Werten befanden. Also sollten die Funktionen Map [Object, Int] zurückgeben

Hier ist was ich bisher habe? Was ist der beste Weg, dies zu erreichen?

val peopleObjects[Person] = Seq[person1, person2, person3] 

val peopleMap[String, Int] = Map[PersonId, Int] 

peopleObjects.filter(person[Person] => peopleMap.contains) 
+0

Ich gehe davon aus, dass Sie Kompilierungsfehler bekommen, da das keine gültige Scala ist. Beginnen Sie damit, sie zu reparieren (oder veröffentlichen Sie sie, wenn Sie Hilfe benötigen). –

Antwort

1

Ihre Namensauswahl ist ein wenig verwirrend. Ich habe versucht, es etwas klarer zu machen, aber wenn id ein String ist, ist es unklar, was die Int darstellt.

class Person(val id: String) {} 
val (tom, jan) = (new Person("tom"), new Person("jan")) 
val persons = Seq[Person](tom, jan) 

val idMap = Map[String, Int]("tom"->4, "jan"->2) 

val personMap = persons.filter(p => idMap.contains(p.id)) 
         .map(p => p->idMap(p.id)) 
         .toMap 
personMap(jan) // res0: Int = 2 
+0

Vielen Dank, dass Sie das deutlicher gemacht haben, was müsste ich noch tun, wenn die Person Seq nun eine Zukunft [Seq [Person]] wäre? –

+1

Verwenden Sie 'map()', um in eine 'Zukunft' zu schauen. Sobald Sie sich eingeloggt haben, können Sie das _eventual_ Ergebnis der Zukunft weiter bearbeiten. – jwvh

+0

@jwvh Was ist val (tom, jan)? – MotaF

1

Ich würde einen etwas anderen Ansatz nehmen. Kreditaufnahme etwas von @jwvh:

case class Person(id: Int, name: String) 
val tom = Person(4, "tom") 
val jan = Person(2, "jan") 
val people: Future[Set[Person]] = Future.successful(Set(tom, jan)) 

val peopleMap = people.map { set => 
    set.map(p => (p -> p.id))(breakOut) 
} 

Grundsätzlich denke ich, Fallklassen und vor allem breakOut, hier sind wirklich nützlich.

Verwandte Themen