Flux de Filtre de 1 liste basée sur une autre liste
Je vous poste ma requête après avoir cherché dans ce forum & google, mais a été incapable de résoudre le même.
par exemple: Link1 Link2 Link3
Je suis en train de filtrer la Liste 2 (colonne multi) basée sur les valeurs de la Liste 1.
List1:
- [Datsun]
- [Volvo]
- [BMW]
- [Mercedes]
List2:
- [1-Jun-1995, Audi, 25.3, 500.4, 300]
- [7-Apr-1996, BMW, 35.3, 250.2, 500]
- [3-May-1996, Porsche, 45.3, 750.8, 200]
- [2-Nov-1998, Volvo, 75.3, 150.2, 100]
- [7-Dec-1999, BMW, 95.3, 850.2, 900]
expected o/p:
- [7-Apr-1996, BMW, 35.3, 250.2, 500]
- [2-Nov-1998, Volvo, 75.3, 150.2, 100]
- [7-Dec-1999, BMW, 95.3, 850.2, 900]
Code
//List 1 in above eg
List<dataCarName> listCarName = new ArrayList<>();
//List 2 in above eg
List<dataCar> listCar = new ArrayList<>();
//Values to the 2 lists are populated from excel
List<dataCar> listOutput = listCar.stream().filter(e -> e.getName().contains("BMW")).collect(Collectors.toList());
Dans le code ci-dessus si je fournir une valeur spécifique, je peux filtre, mais vous ne savez pas comment faire pour vérifier si un Nom de Voiture dans la Liste 2 sorties dans la Liste 1.
Espère que le problème que j'ai le visage est clair, attendent d'orientation (Suis encore relativement nouveau pour Java, donc pardonner si la requête ci-dessus est très basique).
Modifier
Je crois que le lien-3 est prévu ci-dessus devrait permettre de résoudre, mais dans mon cas ça ne fonctionne pas. Peut-être parce que les valeurs de la liste 1 sont peuplées comme
org.gradle04.Main.Cars.dataCarName@4148db48 etc ..
Je suis en mesure d'obtenir la valeur en format lisible par l'homme que lorsque je fais un forEach sur la Liste 1 en appelant la méthode getName.
contains
au lieu de equals
).filter(e -> listCarName.contains(e.getName()))
?La troisième question est lié montre comment réaliser ce que vous voulez: stackoverflow.com/questions/26170264/...
J'ai suivi la solution dans ce thread, mais ne fonctionne pas pour moi. Je suppose que c'est parce que les valeurs de la Liste 1 sont stockés comme par exemple: org.gradle04.Main.Cars.dataCarName@4148db48 pour entrer dans un format lisible par l'homme que j'ai à faire un forEach sur un appel méthode getName. Mais je ne suis pas en mesure de les intégrer dans les critères de filtre. Toutes les suggestions sur comment je dois procéder ? Merci d'avance & toutes mes excuses si ma requête est très basique.
Ce que vous pouvez faire dans ce cas est d'abord convertir le
List<DataCarName>
dans un Set<String>
et ensuite utiliser contains
, dans le filtre.OriginalL'auteur iCoder | 2016-03-27
Vous devez vous connecter pour publier un commentaire.
Il n'est pas clair pourquoi vous avez un
List<DataCarName>
en premier lieu, d'unList/Set<String>
.Le prédicat vous devez fournir doit vérifier si, pour les données correspondantes voiture exemple, il y a son nom dans la liste.
e -> e.getName().contains("BMW")
seulement si le nom de la voiture contient des BMW qui n'est pas ce que vous voulez. Votre première tentative peut-être ensuitemais depuis
listCarName
est unList<DataCarName>
ete.getName()
une chaîne de caractères (je présume), vous obtiendrez une liste vide.La première option que vous avez est de changer le prédicat de sorte que vous obtenir un flux de données à partir de la liste de données les noms de voiture, la carte à leur représentation sous forme de chaîne et vérifier que l'un de ces noms correspond aux données actuelles de la voiture de l'occurrence de nom, vous êtes actuellement filtrage:
Maintenant, c'est très cher parce que vous créer un flux pour chaque instance dans les données de la voiture stream. Une meilleure façon serait de construire un
Set<String>
avec les voitures le nom de l'avance et puis il suffit d'utilisercontains
comme un prédicat sur cet ensemble:OriginalL'auteur
dans votre DataCar type, ne
getName()
retourner une Chaîne de caractères ou la DataCarName type enum? Si c'est le enum, vous pouvez suivre Alexis C de l'approche, mais au lieu de construire un HashSet à l'aide de Collectionneurs.toSet(), de construire un EnumSet, ce qui donne O(1) de la performance. La modification d'Alexis suggestion, le résultat devrait ressembler à:OriginalL'auteur