Java flux de filtrer les éléments de l'indice spécifique
Je suis à la recherche d'une manière concise pour filtrer les éléments d'une Liste à un indice particulier. Mon exemple d'entrée ressemble à ceci:
List<Double> originalList = Arrays.asList(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
List<Integer> filterIndexes = Arrays.asList(2, 4, 6, 8);
Je veux filtrer les éléments à l'index 2
, 4
, 6
, 8
. J'ai une boucle for qui ignore les éléments qui correspondent à l'indice, mais j'espérais qu'il y aurait un moyen facile de le faire à l'aide de flux. Le résultat final devrait ressembler que:
List<Double> filteredList = Arrays.asList(0.0, 1.0, 3.0, 5.0, 7.0, 9.0, 10.0);
- C'est incroyablement facile à l'aide d'un
for
boucle etremove(int)
. Ne pas utiliser les flux pour tout. - Merci @PaulBoddington. Venant de .Travail NET, je suis habitué à l'utilisation de LINQ pour la plupart du tableau/liste d'activités et de ses facile de faire cela à l'aide de LINQ donc espérais quelque chose de similaire serait en Java 8 flux
- Les ruisseaux et toute forme d'indexation ne s'entendent pas bien du tout.
- Ces explicite de la création de la matrice des déclarations comme
new Double[] {…}
etnew Integer[] {…}
sont obsolètes. Simplement utiliser, par exemple,List<Integer> filterIndexes = Arrays.asList(2, 4, 6, 8);
- J'ai posté une réponse à l'aide de deux,
remove(int)
et des ruisseaux.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez générer un
IntStream
pour imiter les indices de la liste d'origine, puis de supprimer ceux qui sont dans lefilteredIndexes
liste et puis la carte de ces indices à leur élément correspondant dans la liste (une meilleure façon serait d'avoir unHashSet<Integer>
pour les indices, car ils sont uniques, par définition, de sorte quecontains
est une constante de temps de l'opération).Si votre
filteredIndexes
liste est prétriés, vous pouvez éviter de vérifier chaque élément de cette façon:Ici, nous créons un certain nombre de sous-listes qui contiennent tous les éléments entre les filtrée indices, puis aplatir un peu dans la seule liste finale. Pour la grande entrée (par exemple, un million de nombres) cette solution pourrait être beaucoup plus rapide que celle proposée par @AlexisC.
Si vous triez vos index décroissant, alors vous pouvez utiliser
java.util.List.remove(int)
pour supprimer les éléments..mapToInt(Integer::valueOf)
. Ce qui fonctionne, mais la conversion de laInteger
objet d'uneint
de la valeur à transmettre àInteger valueOf(int)
pour obtenir de nouveau unInteger
objet qui est ensuite auto-unboxed à unint
que vous utilisezmapToInt
. Vous avez sûrement envie soit,.mapToInt(i->i)
ou.mapToInt(Integer::intValue)
, l'exécution d'une seule unboxing, à la place.Integer::intValue
ce que je cherchais. J'ai aussi essayéFunction.identity()
mais cela ne fonctionne pas.Function.identity()
renvoie uneFunction
plutôt qu'unToIntFunction
, donc qui ne fonctionne pas comme le type classique de compatibilité des règles qui s'appliquent ici, plutôt que la signature fonctionnelle correspondant lors de l'utilisation dex -> x
directement...