Intersection et l'union de ArrayLists en Java
Existe-il des méthodes pour le faire? J'étais à la recherche, mais ne pouvais pas trouver toutes.
Une autre question: j'ai besoin de ces méthodes afin que je puisse filtrer les fichiers.
Certains sont AND
filtres et certains sont OR
filtres (comme dans la théorie des ensembles), j'ai donc besoin de filtre en fonction de tous les fichiers et de les unir/coupe ArrayLists qui contient ces fichiers.
Dois-je utiliser une autre structure de données pour contenir les fichiers? Est-il rien d'autre qui offre une meilleure exécution?
- Si vous ne voulez pas creayte une nouvelle liste, Vecteur.retainAll(Vecteur) les garnitures de votre orignal vecteur uniquement à l'intersection avec la deuxième vecteur.
- pourquoi
Vector
? Cette classe a été découragé depuis Java 1.2. - une interface que j'utilise (je n'ai pas d'option) renvoie des choses comme des vecteurs. Je ne savais pas qu'il avait été découragée ! Merci pour l'info .. Découragés par qui ? Je n'ai pas vu de remarque à ce sujet étant obsolète, donc c'est une surprise
- À partir de la documentation Javadoc: "Comme de la plate-forme Java 2 v1.2. ... il est recommandé d'utiliser ArrayList en place de Vecteur.". Le seul moment où vous pourriez avoir besoin
Vector
pour les interactions de thread, mais il y a de plus sûr structures de données pour ces cas d'utilisation trop. Voir aussi cette question. Toute bibliothèque toujours à l'aide deVector
en 2016 est très suspect à mon avis. - c'est un IBM bibliothèque, haha! (Données Lotus Domino api). Merci pour l'info, très utile
InformationsquelleAutor yotamoo | 2011-03-12
Vous devez vous connecter pour publier un commentaire.
Voici une plaine de mise en œuvre sans l'aide d'une tierce-partie de la bibliothèque. Principal avantage sur les
retainAll
,removeAll
etaddAll
est que ces méthodes ne pas modifier l'original listes d'entrée pour les méthodes.HashSet
pourintersection
de sorte que la moyenne des cas, la performance est O(n) au lieu de O(n^2).HashSet(int initialCapacity)
.Collection (donc ArrayList aussi) ont:
Utiliser une Liste de mise en œuvre si vous acceptez de répétitions, un Jeu de mise en œuvre si vous n'avez pas:
HashSet
à la place.addAll()
est l'union pour les listes, c'est juste de la concaténation de la deuxième liste à la fin de la première. Une opération union permettrait d'éviter l'ajout d'un élément si la première liste contient déjà ça.Ce post est assez vieux, mais néanmoins, il a été le premier popping up sur google lors de la recherche pour ce sujet.
Je veux donner une mise à jour à l'aide de Java 8 flux de travail (essentiellement) la même chose en une seule ligne:
Si quelqu'un a une meilleure, plus rapide solution faites le moi savoir, mais cette solution est une belle chemise qui peuvent être facilement inclus dans une méthode sans ajout inutile helper de classe, de méthode et de toujours garder la lisibilité.
Set
puis utiliser le set decontains
méthode. Pas tout dans la vie a à faire avec des cours d'eau.union sera
removeAll
et puisaddAll
.Obtenir plus de détails dans la documentation de la collecte(ArrayList est une collection)
http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html
retainAll()
etremoveAll()
O(n^2) opérations sur les listes. Nous pouvons faire mieux.retainAll
de {1, 2, 2, 3, 4, 5} plus de {1, 2, 3} résultats dans {1, 2, 2, 3}. Ne devrait-elle pas être {1, 2, 3} à l'intersection?Unions et intersections défini que pour les jeux, et non pas des listes. Comme vous l'avez mentionné.
Vérifier goyave bibliothèque pour les filtres. Aussi goyave offre de réelles les intersections et les syndicats
Vous pouvez utiliser
CollectionUtils
de apache commons.La solution marqué n'est pas efficace. Il a un O(n^2) le temps de la complexité. Ce que nous pouvons faire est de trier les deux listes, et l'exécution d'un algorithme d'intersection comme celui ci-dessous.
Celui-ci a une complexité de O(n log n + n), qui est en O(n log n).
L'union se fait de la même manière. Assurez-vous de faire les modifications appropriées sur l'if-elseif-else.
Vous pouvez également utiliser des itérateurs si vous voulez (je sais qu'ils sont plus efficaces en C++, je ne sais pas si c'est le cas en Java ainsi).
contains()
dans une boucle (comme Devenv est une suggestion) permettrait de prendre en O(n + m) temps. Le tri est inutilement compliqué et prend O(n log n + m log n + n) fois. Accordé que réduit à O(n log n) en temps, mais c'est encore pire qu'en temps linéaire, et beaucoup plus complexe.Je pense que vous devriez utiliser un
Set
pour contenir les fichiers si vous voulez faire de l'intersection et l'union sur eux. Ensuite, vous pouvez utiliser Goyave's Jeux classe pour faireunion
,intersection
et filtrer par unePredicate
ainsi. La différence entre ces méthodes et d'autres suggestions, c'est que toutes ces méthodes permettent de créer paresseux vues de l'union, l'intersection, etc. des deux ensembles. Apache Commons crée une nouvelle collection et des copies des données.retainAll
modifie l'une de vos collections en supprimant des éléments.Ici est une façon de comment vous pouvez faire une intersection avec le cours d'eau (n'oubliez pas que vous devez utiliser java 8 pour les cours d'eau):
Un exemple pour les listes de types différents. Si vous avez une relation entre les foo et bar, et vous pouvez obtenir un bar-objet de foo que vous pouvez modifier vos flux:
J'ai trouvé ListUtils très utile pour ce cas d'utilisation.
Utilisation ListUtils de org.apache.commons.collections, si vous ne voulez pas modifier la liste existante.
ListUtils.intersection(list1, list2)
Vous pouvez utiliser des communes-collections4 CollectionUtils
Dans Java 8, j'utilise de simples méthodes d'aide comme ceci:
Si les objets de la liste sont hashable (c'est à dire avoir une vie décente hashCode et equals fonction), de la manière la plus rapide de l'approche entre les tables env. taille > 20 est de construire un HashSet pour la plus grande des deux listes.
Je travaille aussi sur la situation similaire et atteint ici chercher de l'aide. Fini par trouver ma propre solution pour les Tableaux.
Liste de tableaux AbsentDates = new ArrayList(); //Va Stocker Matrice1-Matrice2
Remarque : l'Affichage de cette si ça peut aider quelqu'un à atteindre cette page pour obtenir de l'aide.
Intersection de deux de la liste d'objet différent fondé sur la common key - Java 8
Solution finale:
D'abord, je suis de copier toutes les valeurs de tableaux dans un seul tableau, puis je suis en supprimant les doublons valeurs dans le tableau. La ligne 12, en expliquant si même nombre se produisent plus que temps puis mettre de poubelles supplémentaires valeur en "j" de la position. À la fin, à traverser de début et de fin et de vérifier si même la valeur d'ordures se produire, puis jetez-le.
ArrayList
, pour stocker le résultat de l'union.Integer
plutôt queint
. Ensuite, vous pouvez utilisernull
à la place de votre "valeur d'ordures". "Les ordures valeurs" ou de "sentinelle des valeurs" sont généralement une mauvaise idée, parce que ces valeurs peuvent encore se produire dans l'entrée.Après le test, voici mon meilleur intersection approche.
Vitesse plus rapide par rapport à la pure HashSet Approche. HashSet et HashMap ci-dessous a des performances similaires pour les tableaux avec plus de 1 million de disques.
Comme pour Java 8 Flux approche, la vitesse est assez lente pour la taille de la matrice de plus de 10k.
Espère que cela peut vous aider.
Si vous avez eu vos données dans des Ensembles, vous pourriez utiliser la Goyave est
Configure
classe.Si le nombre de matches que je vérifie c'est tout d'abord le temps ou pas avec l'aide de "indexOf()" si le numéro correspond première fois, puis l'imprimer et l'enregistrer dans une chaîne de sorte que la prochaine fois même nombre de matches alors c'est de ne pas imprimer en raison en raison de "indexOf()" condition sera fausse.
}