Comment compter le nombre d'occurrences d'un élément dans une Liste
J'ai un ArrayList
, une Collection de classes de Java, comme suit:
ArrayList<String> animals = new ArrayList<String>();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");
Comme vous pouvez le voir, le animals
ArrayList
se compose de 3 bat
éléments et un owl
élément. Je me demandais si il existe une API dans le cadre de Collecte qui renvoie le nombre de bat
occurrences ou si il y a une autre façon de déterminer le nombre d'occurrences.
J'ai constaté que Google Collecte Multiset
possède une API qui renvoie le nombre d'occurrences d'un élément. Mais qui est uniquement compatible avec le JDK 1.5. Notre produit est actuellement en JDK 1.6, donc je ne peux pas l'utiliser.
- C'est une des raisons pourquoi vous devez programmer une interface plutôt qu'une mise en œuvre. Si vous arrivez à trouver la bonne collection, vous devez changer le type d'utilisation que de la collection. Je vais poster une réponse sur ce.
Vous devez vous connecter pour publier un commentaire.
Je suis sûr que la statique de la fréquence de la méthode dans les Collections seraient utiles ici:
C'est la façon dont je le ferais de toute façon. Je suis assez sûr que c'est jdk 1.6 vers le haut.
Dans Java 8:
Collections.frequency()
? Il semble de moins en moins lisible.Cette montre, pourquoi il est important de "Faire référence à des objets par leurs interfaces" comme décrit dans la Efficace Java livre.
Si vous le code pour la mise en œuvre et utiliser ArrayList dans, disons, 50 places dans votre code, lorsque vous trouvez une bonne "Liste" de mise en œuvre qu'à compter les objets, vous devrez modifier tous les personnes de plus de 50 places, et probablement vous aurez à casser votre code ( si il n'est utilisé que par vous il n'y a pas une grosse affaire, mais si il est utilisé par quelqu'un d'autre l'utilise, vous aurez briser leur code de trop)
Par la programmation de l'interface, vous pouvez laisser ces 50 places inchangé et remplacer la mise en œuvre de ArrayList pour "CountItemsList" (par exemple ) ou d'une autre classe.
Ci-dessous est un exemple très simple sur la façon dont cela pourrait être écrit. Ce n'est qu'un échantillon, un prêt pour la production de la Liste serait beaucoup plus compliqué.
OO principes appliqués ici: l'héritage, le polymorphisme, l'abstraction, l'encapsulation.
Désolé il n'y a pas simple appel de méthode qui peut le faire. Tout vous devez faire est de créer une carte et de fréquence de comptage avec elle.
Effectivement, les Collections de la classe possède une méthode statique nommée : fréquence(Collection c, Object o) renvoie le nombre d'occurrences de l'élément que vous recherchez, par la manière, ce sera fonctionner parfaitement pour vous:
Il n'existe pas de méthode native en Java pour le faire pour vous. Toutefois, vous pouvez utiliser IterableUtils#countMatches() de Apache Commons-Collections pour le faire pour vous.
Je me demande, pourquoi vous ne pouvez pas utiliser que Google Collecte de l'API du JDK 1.6. Est-il le dire? Je pense que vous pouvez, il ne devrait pas y avoir de problèmes de compatibilité, car il est construit pour une version inférieure. L'affaire aurait été différente si qui ont été construites pour 1.6 et que vous exécutez la version 1.5.
Je me trompe quelque part?
Un peu plus efficace, peut-être
Alternative Java 8 solution à l'aide de Flux:
Moyen Simple de trouver l'occurrence de la chaîne de valeur dans un tableau à l'aide de Java 8.
De sortie : {Cat=2, Chèvre=1, Vache=1, vache=1, Chien=1}
Vous pouvez le remarquer "la Vache et de lait de vache ne sont pas considérées comme de la même chaîne, dans le cas où vous requis en vertu du même comte, utiliser .toLowerCase(). S'il vous plaît trouver l'extrait de code ci-dessous pour les mêmes.
De sortie : {cat=2, la vache=2, chèvre=1, chien=1}
Ce que vous voulez, c'est un Sac qui est comme un ensemble, mais aussi de compter le nombre d'événements. Malheureusement, la java des Collections cadre - grands car ils sont de ne pas avoir un Sac impl. Pour cela on doit utiliser Apache Commun de Collecte texte du lien
Pour obtenir les occurrences de l'objet à partir de la liste directement:
Pour obtenir l'occurrence de l'Objet de collection à l'intérieur de la liste, remplacer la méthode equals de la classe de l'Objet comme:
Appeler les Collections.fréquence:
Java 8 - une autre méthode
Si vous utilisez Eclipse Collections, vous pouvez utiliser un
Bag
. UnMutableBag
peut être retourné à partir de la mise en œuvre desRichIterable
en appelanttoBag()
.La
HashBag
mise en œuvre de la CE est soutenu par uneMutableObjectIntMap
.Remarque: je suis un committer pour Eclipse Collections.
Méthode 1:
Méthode 2:
Mettre les éléments de la liste de tableaux dans la table de hachage à compter de la fréquence.
Donc le faire à l'ancienne et rouler votre propre:
Si vous êtes un utilisateur de mon ForEach DSL, il peut être fait avec un
Count
requête.Je ne voulais pas faire de ce cas plus difficile et il a fait avec deux itérateurs
J'ai une table de hachage avec de Nom -> Prenom. Et ma méthode doit supprimer des éléments avec dulicate Prénom.
De sortie: