Disons que j'ai fait ce qui suit.
ArrayList<Object> happylist = new ArrayList<Object>(); happylist.add("cat"); happylist.add(98); ...
Et ainsi de suite, en ajoutant différents types d'éléments. Quel type de méthode m'aiderait à compter combien de fois il y avait une référence à un certain type dans mon ArrayList?
5 Réponses :
Vous pouvez utiliser la méthode getClass ()
pour déterminer la classe d'un objet.
Consultez la documentation de Object < / a>.
static long countByTypeJava8(Collection col, Class clazz) { return col.stream() .filter(clazz::isInstance) .count(); } static long countByType(Collection col, Class clazz) { long count = 0; for (Object o : col) { if (clazz.isInstance(o)) { count++; } } return count; }
Cela pourrait facilement être fait en comptant le nombre de types de références différents dans la liste en utilisant des réflexions. J'ai codé la méthode suivante:
public Map<String, Integer> countReferences(List<Object> happyList) { Map<String, Integer> referenceCounter = new HashMap<>(); for (Object object : happyList) { String className = object.getClass().getName(); referenceCounter.put(className, referenceCounter.getOrDefault(className, 0) + 1); } return referenceCounter; }
Fondamentalement, chaque classe avec un nom de différence donne une référence à la différence. En comptant les références à chaque type et en les stockant dans la carte, vous obtenez ce que vous recherchez.
Mais je ne suis pas tout à fait sûr de l'utilité de tels problèmes particuliers.
Dans Java 8 ou une autre version haute, vous pouvez utiliser l'API Stream Group pour faire, un code simple comme celui-ci:
ArrayList<Object> happylist = new ArrayList<Object>(); happylist.add("cat"); happylist.add(98); happylist.add(198); happylist.add(1L); Map<Object,IntSummaryStatistics> result = happylist.stream() .collect(Collectors.groupingBy(o -> o.getClass(),Collectors.summarizingInt(value -> 1))); // output result result.entrySet().stream() .forEach(entry -> System.out.println(String.format("class name = %s\t sum count = %d",entry.getKey(),entry.getValue().getSum())));
IntSummaryStatistics est un objet d'état pour la collecte de statistiques telles que nombre, min, max, somme et moyenne.
Merci pour vos réponses, elles ont beaucoup aidé. Pour mon problème particulier dans la vraie vie, j'ai pu atténuer mon problème en sachant à l'avance quel type je recherchais. Dans mon cas, j'ai utilisé la méthode suivante pour appeler la méthode main.
int counter = 0; for (int i = 0; i < happylist.size(); i++) { if (happylist.get(i) instanceof WantedType) { counter++; } } return counter;