/** * 书本:《Thinking In Java》 * 功能:为了对pet进行计数,我们做一个能跟踪各种不同类型的Pet的数量的工具,用map。这里使用动态instanceof() * 我们可以使用Class.isAssignableFrom(),创建一个不局限于Pet的计数通用工具 * 文件:PetCount3.java * 时间:2015年4月14日09:56:41 * 作者:cutter_point */ package net.mindview.util; import java.util.HashMap; import java.util.Map; import Lesson14TypeInformation.pets.Pet; public class TypeCounter extends HashMap<Class<?>, 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(obj + " incorrect type: " + type + ", should be type or subtype of" + baseType); } this.countClass(type); //添加一个类型 } private void countClass(Class<?> type) { Integer quantity = this.get(type); //获取这个类型属性的个数 //添加一个,或新增一个类对象 this.put(type, quantity == null? 1 : quantity + 1); //得到父类,引用 Class<?> superClass = type.getSuperclass(); if(superClass != null && baseType.isAssignableFrom(superClass)) countClass(superClass); //递归,父类型也会加1 } public String toString() { StringBuilder result = new StringBuilder("{ "); for(Map.Entry<Class<?>, Integer> pair : this.entrySet())//遍历所有的不重复的对象 { result.append(pair.getKey().getSimpleName()); //类名 result.append(" = "); result.append(pair.getValue()); result.append(", "); } result.delete(result.length() - 2, result.length()); //去掉最后的", " result.append(" }"); return result.toString(); } }
这个就是当一个类进来的时候我们要计数,但是这个类计数了他的父类呢?父类也应该加1的,那么父类的父类呢?所以我们用递归,一层一层的向上递归,直到找到基类,然后把基类也+1.
/** * 书本:《Thinking In Java》 * 功能:为了对pet进行计数,我们做一个能跟踪各种不同类型的Pet的数量的工具,用map。这里使用动态instanceof() * 文件:PetCount4.java * 时间:2015年4月14日09:25:29 * 作者:cutter_point */ package Lesson14TypeInformation; import net.mindview.util.TypeCounter; import static net.mindview.util.Print.*; import Lesson14TypeInformation.pets.Pet; import Lesson14TypeInformation.pets.Pets; public class PetCount4 { public static void main(String args[]) { TypeCounter counter = new TypeCounter(Pet.class); for(Pet pet : Pets.createArray(20)) { printnb(pet.getClass().getSimpleName() + " "); counter.count(pet); } print(); print(counter); } }
Rat -obj2 Manx -obj2 Cymric -obj2 Mutt -obj2 Pug -obj2 Cymric -obj2 Pug -obj2 Manx -obj2 Cymric -obj2 Rat -obj2 EgyptianMau -obj2 Hamster -obj2 EgyptianMau -obj2 Mutt -obj2 Mutt -obj2 Cymric -obj2 Mouse -obj2 Pug -obj2 Mouse -obj2 Cymric -obj2
{ Dog = 6, Rodent = 5, Rat = 2, Hamster = 1, Pug = 3, Cymric = 5, Manx = 7, Cat = 9, Mutt = 3, Pet = 20, Mouse = 2, EgyptianMau = 2 } obj1
原文地址:http://blog.csdn.net/cutter_point/article/details/45786253