假设我已经做了以下内容。
ArrayList<Object> happylist = new ArrayList<Object>();
happylist.add("cat");
happylist.add(98);
...
等等,添加不同类型的元素。什么样的方法可以帮助我计算我的Arraylist中有多少次对某些类型的引用?
您可以使用getClass()
方法来确定某些对象的类。
查看对象的文档。
可以很容易地完成使用反射列表中不同类型的参考的数量。我已经编码以下方法:
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;
}
基本上,每个具有差异名称的类给出差异参考。通过计算每种类型的引用,并将它们存储在地图中可以为您提供所需的内容。
,但我不太确定此类特定问题的有用性。
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;
}
在Java 8或其他高版本中,您可以使用流组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 = %st sum count = %d",entry.getKey(),entry.getValue().getSum())));
intsummaryStatistics是用于收集统计数据的状态对象,例如计数,最低,最大,总和和平均值。
谢谢您的回答,他们对此有很大帮助。对于现实生活中的特殊问题,我能够事先知道我正在寻找什么类型来缓解问题。就我而言,我做了以下方法来调用主要方法。
int counter = 0;
for (int i = 0; i < happylist.size(); i++) {
if (happylist.get(i) instanceof WantedType) {
counter++;
}
} return counter;