2017-10-04 3 views
1

J'ai une liste d'objets [T], dont chacun a une autre liste d'objets [M]. Je voudrais filtrer la liste interne M valeur donnée pour la comparaison.Comment filtrer les éléments d'une sous-liste d'objets dans scala?

Voici un exemple de cette liste:

case class People(val name: String, val pets: List[Pet]) 

case class Pet(val name: String, val `type`: String) 

val noisyNeighbors = List(
    People(
    "Obelix", 
    List(
     Pet("koko", "cat"), 
     Pet("kiki", "dog") 
    ) 
), 
    People(
    "Asterix", 
    List(
     Pet("piki", "lizard"), 
     Pet("poko", "dog") 
    ) 
) 
) 

Compte tenu d'un val petTypeToRemove = "dog", je voudrais avoir une liste de résultats de:

val lessNoisyNeighbors = List(
    People(
    "Obelix", 
    List(
     Pet("koko", "cat") 
    ) 
), 
    People(
    "Asterix", 
    List(
     Pet("piki", "lizard") 
    ) 
) 
) 

J'ai essayé quelques petites choses, mais je ne sais pas vraiment où commencer:

val lessNoisyNeighbors = noisyNeighbors.filter { 
    ??? 
} 

Répondre

0

Appel map sur le List des voisins, et pour chaque voisin, remplacez-le par une copie dont les animaux de compagnie du type spécifié sont filtrés. Notez que rien ici n'est muté.

val petTypeToRemove = "dog" 

val lessNoisyNeighbors = 
    noisyNeighbors.map(n => n.copy(pets = n.pets.filterNot(_.`type` == petTypeToRemove))) 
0

Vous ne voulez pas filtrer les voisins (de la façon dont vous voulez gérer Astérix).

val lessNoisyNeighbors = noisyNeighbors.map { neighbor => 
    neighbor.copy(pets = neighbor.pets.filter(_ != petTypeToRemove)) 
} 

Certains embellissement de là pourraient être nécessaires (par exemple pour préserver l'égalité de référence lorsque cela est possible, ou d'enlever une personne dont le seul animal de compagnie est un animal de compagnie pour enlever), mais c'est le squelette de base.