【ThinkingInJava】32、递归计数

来源:互联网 发布:网站域名备案注册证书 编辑:程序博客网 时间:2024/06/05 20:51
/*** 书本:《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







0 1
原创粉丝点击