3
votes

Compter le nombre de références à certains types dans ArrayList

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?


0 commentaires

5 Réponses :


1
votes

Vous pouvez utiliser la méthode getClass () pour déterminer la classe d'un objet.

Consultez la documentation de Object < / a>.


0 commentaires

0
votes
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;
}

0 commentaires

1
votes

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.


0 commentaires

0
votes

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.


0 commentaires

0
votes

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;


0 commentaires