Obtenez de l'intersection de plusieurs Listes en utilisant retainAll en Java
Je vais avoir des problèmes pour obtenir l'intersection de plusieurs Listes sur Java. Ce que je fais, c'est ceci:
Je reçois (disons) 3 Listes de nombres entiers:
liste 1: [2, 2, 2, 2, 5, 5]
liste 2: [2, 2, 103]
liste 3: [2, 431]
Je suis en train d'utiliser retainAll à la première utilisation de chacun des autres listes:
list1.retainAll(list2);
list1.retainAll(list3);
Et j'obtiens ce résultat:
list1: [2, 2, 2, 2]
Mais je m'attends à obtenir un:
list1: [2]
...Puisque le seul élément toutes les listes d'action est un 2 et pas quatre 2.
Je sais que c'est probablement le comportement attendu de la retainAll fonction, mais j'ai besoin d'obtenir le résultat que j'ai mentionné ci-dessus.
De l'aide?
Edit:
À l'aide d'un HashSet pour interdire les doublons ne suffit pas non plus. Dans ce cas, par exemple:
liste 1: [2, 2, 2, 2, 5, 5]
liste 2: [2, 2, 103]
liste 3: [2, 2, 2, 431]
J'ai besoin pour obtenir un résultat de:
liste 1: [2, 2] (car toutes les listes ont au moins une paire de 2)
Au lieu de
liste 1: [2]
- Vous avez d'abord besoin d'indiquer clairement ce que vous attendez. Voulez-vous conserver les valeurs qui sont les mêmes et au même indice dans les deux listes? Ou voulez-vous conserver les éléments qui sont présents dans les deux listes, et de ne garder que le même nombre que dans la deuxième liste? Ou quelque chose d'autre?
Vous devez vous connecter pour publier un commentaire.
Ce que c'est que cette méthode:
Ce problème peut être résolu plus facile avec un multiset structure de données. Par exemple, si vous utilisez la goyave est
Multiset
, vous pouvez utiliserMultisets.retainOccurrences()
Je voudrais utiliser une sorte de
Set
, peut-être unHashSet
. Ils ne vont pas ajouter les éléments en double, et ils ont leretainAll
méthode.Voici la la documentation javadoc pour
Set
.Avec
retainAll
, vous obtiendrez une réponse incorrecte comme vous l'avez dit. Je vous recommande d'utiliserHashMap
garderinteger/count
paires de numérisation et de chaque autre liste et affiner votremap
.map
à partir des valeurs delist1
.min(# of intg in other_list, map.get(intg))
et mise à jour de lamap
avec cette valeur.map
sera l'intersection de toutes les listes.Au lieu d'une liste vous avez besoin d'une structure de données appelée sac, ou multiset. L'Apache commons collections de la bibliothèque par exemple comprend un:
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/Bag.html#retainAll(java.util.Collection)
retainAll
méthode lié ne pas respect de la cardinalité, qui est ce qu'il essaie d'accomplir.Ici est un juste comme vous l'aimez et il est récursif.