计算对ArrayList中某种类型的引用的数量

时间:2019-02-21 23:23:09

标签: java arraylist

让我说以下。

ArrayList<Object> happylist = new ArrayList<Object>();
happylist.add("cat");
happylist.add(98);
...

以此类推,添加不同类型的元素。哪种方法可以帮助我计算ArrayList中对某个类型的引用有多少次?

5 个答案:

答案 0 :(得分:1)

您可以使用getClass()方法来确定某个对象的类。

看看Object的文档。

答案 1 :(得分:1)

使用反射可以轻松地计算列表中不同类型参考的数量。我已经编写了以下方法:

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

基本上,每个具有差异名称的类都提供差异引用。通过计算对每种类型的引用并将其存储在map中,可以为您提供所需的内容。

但是我不太确定此类特殊问题的用处。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在Java 8或其他高版本中,您可以使用Stream Group API进行操作,像这样的简单代码:

    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是用于收集统计信息(例如计数,最小值,最大值,总和和平均值)的状态对象。

答案 4 :(得分:0)

感谢您的回答,他们提供了很多帮助。对于现实生活中的特定问题,我能够通过事先知道要寻找的类型来缓解问题。就我而言,我执行了以下方法来调用main方法。

int counter = 0;
for (int i = 0; i < happylist.size(); i++) {
   if (happylist.get(i) instanceof WantedType) {
      counter++;
   }
} return counter;