J'essaye avec une boucle comme ça
// ArrayList tourists
for (Tourist t : tourists) {
if (t != null) {
t.setId(idForm);
}
}
Mais ce n'est pas sympa. Quelqu'un peut-il me suggérer une meilleure solution?
Quelques repères utiles pour prendre une meilleure décision:
Tandis que la boucle, pour la boucle et le test de performance d'itérateur
Iterator
? Creusez java-doc. download.oracle.com/javase/6/docs/api/java/util/…Réponses:
Essayer:
Lisez l' API Java . Le code lancera
java.lang.UnsupportedOperationException
pour les listes immuables (telles que créées avecArrays.asList
); voir cette réponse pour plus de détails.la source
List.removeAll()
est n ^ 2 . Juste dire.O(n)
me semble tout à fait pourArrayList
etLinkedList
.contains()
boucle tout le tableau) et comme ilsingleton
ne s'agit que d'un élémentN * 1 = N
. Cependant, généralement, ce serait le casN^2
.À partir de 2015, c'est le meilleur moyen (Java 8):
Remarque: Ce code sera lancé
java.lang.UnsupportedOperationException
pour les listes de taille fixe (telles que créées avec Arrays.asList), y compris les listes immuables.la source
removeIf
c'est plus rapide, mais c'est une supposition.Arrays.asList
n'est pas immuable . Il est de taille fixe.la source
Pas efficace, mais court
la source
Si vous préférez des objets de données immuables, ou si vous ne voulez tout simplement pas être destructeur pour la liste d'entrée, vous pouvez utiliser les prédicats de Guava.
la source
la source
removeAll(..null..)
. Merci!Avant Java 8, vous devez utiliser:
Utilisation post-Java 8:
La raison ici est la complexité du temps. Le problème avec les tableaux est qu'une opération de suppression peut prendre du temps O (n). En réalité, en Java, il s'agit d'une copie de tableau des éléments restants déplacés pour remplacer l'emplacement vide. De nombreuses autres solutions proposées ici déclencheront ce problème. Le premier est techniquement O (n * m) où m vaut 1 car c'est un singleton nul: donc O (n)
Vous devriez removeAll du singleton, en interne, il fait un batchRemove () qui a une position de lecture et une position d'écriture. Et répète la liste. Lorsqu'il atteint une valeur nulle, il itère simplement la position de lecture de 1. Quand ils sont identiques, il passe, quand ils sont différents, il continue à copier les valeurs. Puis à la fin, il s'adapte à la taille.
Il le fait efficacement en interne:
Ce que vous pouvez voir explicitement est une opération O (n).
La seule chose qui pourrait jamais être plus rapide est si vous avez itéré la liste des deux extrémités, et lorsque vous avez trouvé un null, vous définissez sa valeur égale à la valeur que vous avez trouvée à la fin et décrémentez cette valeur. Et itéré jusqu'à ce que les deux valeurs correspondent. Vous gâcheriez l'ordre, mais réduiriez considérablement le nombre de valeurs que vous définissez par rapport à celles que vous avez laissées seules. Ce qui est une bonne méthode à connaître mais qui n'aidera pas beaucoup ici car .set () est fondamentalement gratuit, mais cette forme de suppression est un outil utile pour votre ceinture.
Bien que cela semble assez raisonnable, le .remove () sur l'itérateur appelle en interne:
Ce qui est encore l'opération O (n) dans l'enlèvement. Il fait un System.arraycopy () qui n'est pas non plus ce que vous voulez, si vous vous souciez de la vitesse. Cela en fait n ^ 2.
Il y a aussi:
Qui est O (m * n ^ 2). Ici, nous ne faisons pas qu'itérer la liste. Nous réitérons la liste entière, chaque fois que nous correspondons à la valeur nulle. Ensuite, nous effectuons n / 2 (moyennes) opérations pour faire le System.arraycopy () pour effectuer la suppression. Vous pouvez littéralement trier toute la collection entre les éléments avec des valeurs et les éléments avec des valeurs nulles et couper la fin en moins de temps. En fait, c'est vrai pour tous les cassés. Au moins en théorie, le system.arraycopy réel n'est pas réellement une opération N en pratique. En théorie, théorie et pratique sont la même chose; en pratique, ils ne le sont pas.
la source
Il existe un moyen simple de supprimer toutes les
null
valeurs decollection
.Vous devez passer une collection contenant null comme paramètre à laremoveAll()
méthodela source
La
Objects
classe a unnonNull
Predicate
qui peut être utilisé avecfilter
.Par exemple:
la source
En utilisant Java 8, vous pouvez le faire en utilisant
stream()
etfilter()
ou
Pour plus d'informations: Java 8 - Streams
la source
C'est un moyen facile de supprimer les valeurs nulles par défaut de l'arraylist
sinon, la valeur de chaîne "null" est supprimée de l'arraylist
la source
J'ai joué avec cela et j'ai découvert que trimToSize () semble fonctionner. Je travaille sur la plate-forme Android donc ça pourrait être différent.
la source
trimToSize
ne modifie pas le contenu d'un fichierArrayList
. Si c'est différent sous Android, c'est probablement un bug.Nous pouvons utiliser l'itérateur pour le même pour supprimer toutes les valeurs nulles.
la source
J'ai utilisé l'interface de flux avec l'opération de collecte de flux et une méthode d'assistance pour générer une nouvelle liste.
la source
tourists.stream().filter(s -> s != null).collect(Collectors.toList());
J'utilise principalement ceci:
Mais après avoir appris Java 8, je suis passé à ceci:
la source
En utilisant Java 8, cela peut être effectué de différentes manières en utilisant des flux, des flux parallèles et une
removeIf
méthode:Le flux parallèle utilisera les processeurs disponibles et accélérera le processus pour des listes de taille raisonnable. Il est toujours conseillé d'effectuer un benchmark avant d'utiliser les flux.
la source
Similaire à la réponse @Lithium, mais ne renvoie pas d'erreur "La liste peut ne pas contenir de type null":
la source
la source