【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
- 【ThinkingInJava】32、递归计数
- 【ThinkingInJava】29、对类进行计数
- 【ThinkingInJava】31、对pet进行计数(3)
- ThinkingInJava
- 【ThinkingInJava】笔记
- 【2】ThinkingInJava学习笔记
- 【3】ThinkingInJava学习笔记
- 【4】ThinkingInJava学习笔记
- 【6】ThinkingInJava学习笔记
- 【7】ThinkingInJava学习笔记
- 【8】ThinkingInJava学习笔记
- 【ThinkingInJava】1、几个练习题
- 【ThinkingInJava】2、直接常量
- 【ThinkingInJava】3、Foreach语法
- 【ThinkingInJava】11、接口使用
- 【ThinkingInJava】23、反向迭代器
- 【ThinkingInJava】41、捕获转换
- 【ThinkingInJava】44、数据生成器
- Android 给listview/gridview设置加载动画(逐条加载条目动画)
- 第11周 【项目0 - 是春哥啊】
- 【ThinkingInJava】31、对pet进行计数(3)
- sql学习笔记(13)-----------sql函数总结
- 第11周 【项目1 - 存储班长信息的学生类】
- 【ThinkingInJava】32、递归计数
- iptables详解
- Spark GC 调优
- C++ 在window8下使用第三方插件出现 Unable to register this add-in because its DllRegisterServer returns an error
- 笔记本搜索不到对应的无线网络的问题
- 人脸识别国内外现状及发展
- 易语言个人见解
- springMVC框架下JQuery传递并解析Json数据
- unix环境高级编程编译方法 -apue最简单编译方法(第二版)