J'ai une ArrayList
, une classe Collection 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 se animals
ArrayList
compose de 3 bat
éléments et d'un owl
élément. Je me demandais s'il existe une API dans le framework Collection qui renvoie le nombre d' bat
occurrences ou s'il existe un autre moyen de déterminer le nombre d'occurrences.
J'ai trouvé que Google's Collection Multiset
a une API qui renvoie le nombre total d'occurrences d'un élément. Mais cela n'est compatible qu'avec JDK 1.5. Notre produit est actuellement en JDK 1.6, donc je ne peux pas l'utiliser.
Réponses:
Je suis presque sûr que la méthode de fréquence statique dans les collections serait utile ici:
C'est comme ça que je le ferais de toute façon. Je suis presque sûr que c'est jdk 1.6 directement.
la source
Dans Java 8:
la source
Collections.frequency()
? Cela semble moins lisible.Cela montre pourquoi il est important de «faire référence aux objets par leurs interfaces » comme décrit dans le livre Effective Java .
Si vous codez pour l'implémentation et utilisez ArrayList dans, disons, 50 endroits dans votre code, lorsque vous trouvez une bonne implémentation "List" qui compte les éléments, vous devrez changer tous ces 50 emplacements, et vous devrez probablement casser votre code (s'il n'est utilisé que par vous, il n'y a pas grand-chose, mais s'il est utilisé par quelqu'un d'autre, vous casserez aussi son code)
En programmant sur l'interface, vous pouvez laisser ces 50 emplacements inchangés et remplacer l'implémentation d'ArrayList par «CountItemsList» (par exemple) ou une autre classe.
Vous trouverez ci-dessous un exemple très basique sur la façon dont cela pourrait être écrit. Ceci n'est qu'un exemple, une liste prête pour la production serait beaucoup plus compliquée.
Principes OO appliqués ici: héritage, polymorphisme, abstraction, encapsulation.
la source
Désolé, aucun appel de méthode simple ne peut le faire. Tout ce que vous avez à faire est de créer une carte et de compter la fréquence avec.
la source
Il n'y a pas de méthode native en Java pour le faire pour vous. Cependant, vous pouvez utiliser IterableUtils # countMatches () d'Apache Commons-Collections pour le faire pour vous.
la source
En fait, la classe Collections a une méthode statique appelée: frequency (Collection c, Object o) qui renvoie le nombre d'occurrences de l'élément que vous recherchez, au fait, cela fonctionnera parfaitement pour vous:
la source
Solution alternative Java 8 utilisant Streams :
la source
Je me demande pourquoi vous ne pouvez pas utiliser l'API de collecte de Google avec JDK 1.6. Le dit-il? Je pense que vous pouvez, il ne devrait y avoir aucun problème de compatibilité, car il est conçu pour une version inférieure. Le cas aurait été différent si cela avait été construit pour 1.6 et que vous exécutiez 1.5.
Est-ce que je me trompe quelque part?
la source
Une approche légèrement plus efficace pourrait être
la source
Pour obtenir directement les occurrences de l'objet dans la liste:
Pour obtenir l'occurrence de la collection Object dans la liste, remplacez la méthode equals dans la classe Object comme suit:
Appelez Collections.frequency comme suit:
la source
Méthode simple pour trouver l'occurrence d'une valeur de chaîne dans un tableau à l'aide des fonctionnalités de Java 8.
Sortie: {Chat = 2, Chèvre = 1, Vache = 1, Vache = 1, Chien = 1}
Vous pouvez remarquer que "Cow" et cow ne sont pas considérés comme la même chaîne, au cas où vous en auriez besoin sous le même nombre, utilisez .toLowerCase (). Veuillez trouver l'extrait ci-dessous pour le même.
Sortie: {chat = 2, vache = 2, chèvre = 1, chien = 1}
la source
toString()
est inutile. Vous pouvez simplement faire:duplicateList.stream().collect(Collectors.groupingBy(e -> e,Collectors.counting()));
Ce que vous voulez, c'est un sac - qui est comme un ensemble mais qui compte également le nombre d'occurrences. Malheureusement, le framework java Collections - génial car ils n'ont pas d'implément de sac. Pour cela, il faut utiliser le texte du lien Apache Common Collection
la source
Méthode 1:
Méthode 2:
la source
Si vous utilisez des collections Eclipse , vous pouvez utiliser un fichier
Bag
. AMutableBag
peut être renvoyé à partir de n'importe quelle implémentation deRichIterable
en appelanttoBag()
.L'
HashBag
implémentation dans les collections Eclipse est soutenue par un fichierMutableObjectIntMap
.Remarque: je suis un committer pour les collections Eclipse.
la source
Mettez les éléments de l'arraylist dans le hashMap pour compter la fréquence.
la source
Java 8 - une autre méthode
la source
Alors faites-le à l'ancienne et roulez le vôtre:
la source
Si vous êtes un utilisateur de mon ForEach DSL , cela peut être fait avec une
Count
requête.la source
Je ne voulais pas rendre ce cas plus difficile et je l'ai fait avec deux itérateurs J'ai un HashMap avec LastName -> FirstName. Et ma méthode devrait supprimer les éléments avec un prénom dulicat.
la source
Production:
la source
la source
la source