针对计算各种基类或者出现子类的次数,写了一个通用的计算方法。
简单原理就是hashMap ,遇到还有基类的话就递归
package tween; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class TypeCounter extends HashMap,Integer>{ private Class> baseType; public TypeCounter(Class> baseType){ this.baseType = baseType; } public void count(Object obj){ Class> type = obj.getClass(); if(!baseType.isAssignableFrom(type)){ throw new RuntimeException(); } countClass(type); } private void countClass(Class> type) { // TODO Auto-generated method stub Integer i = get(type); System.out.println(i+"========="+type); put(type,i==null?1:++i); Class> paretType = type.getSuperclass(); if(paretType!=null&&baseType.isAssignableFrom(paretType)){ countClass(paretType); } } public String toString(){ StringBuilder sb =new StringBuilder("{"); for(Map.Entry,Integer> p:entrySet()){ sb.append(p.getKey().getSimpleName()); sb.append("="); sb.append(p.getValue()); sb.append(", "); } sb.delete(sb.length()-2, sb.length()); sb.append("}"); return sb.toString(); } public static void main(String[] args) { TypeCounter type = new TypeCounter(A1.class); List list = Arrays.asList(new A1(),new A1(),new A3(),new A1(),new A2(),new A3()); for(A1 a:list){ type.count(a); } System.out.println(type); List> lists = new ArrayList(); } } class A1{} class A2 extends A1{} class A3 extends A1{}