【ThinkingInJava】31、对pet进行计数(3)

我们不在使用前面那种笨拙的方式,n个instanceof来判断了

/**
* 书本:《Thinking In Java》
* 功能:为了对pet进行计数,我们做一个能跟踪各种不同类型的Pet的数量的工具,用map。这里使用动态instanceof()
* 文件:PetCount3.java
* 时间:2015年4月14日09:25:29
* 作者:cutter_point
*/
package Lesson14TypeInformation;

import java.util.LinkedHashMap;
import java.util.Map;

import net.mindview.util.MapData;
import static net.mindview.util.Print.*;

import Lesson14TypeInformation.pets.LiteralPetCreator;
import Lesson14TypeInformation.pets.Pet;
import Lesson14TypeInformation.pets.Pets;

public class PetCount3
{
	static class PetCounter extends LinkedHashMap<Class<? extends Pet>, Integer>
	{
		//构造函数
		public PetCounter()
		{
			super(MapData.map(LiteralPetCreator.allTypes, 0));	//初始化所有的类别的个数为0
		}

		public void count(Pet pet)	//吧这个pet对象添加到map里面
		{
			for(Map.Entry<Class<? extends Pet>, Integer> pair : this.entrySet())
			{
				if(pair.getKey().isInstance(pet))	//找到了和pet匹配的对像,那么就添加一个
				{
					this.put(pair.getKey(), pair.getValue() + 1);
				}
			}
		}

		public String toString()
		{
			StringBuilder result = new StringBuilder("{ ");
			for(Map.Entry<Class<? extends Pet>, 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();
		}
	}

	public static void main(String[] args)
	{
		PetCounter petCount = new PetCounter();
		for(Pet pet : Pets.createArray(20))
		{
			printnb(pet.getClass().getSimpleName() + " ");
			petCount.count(pet); //吧这个pet加入进去
		}

		print();
		print(petCount);	//输出所有的个数
	}

}

好的,这样做似乎是真把把代码简单化了,单如果我们仔细看看的话,其实这代码写的并不完美,相对第一种来说,这种的时间复杂度会很高,当不是20个的数量级而是200000000000000000的时候,这个代码估计就不好玩了,好啦,不废话了

输出:

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

{ Pet = 20, Dog = 6, Cat = 9, Rodent = 5, Mutt = 3, Pug = 3, EgyptianMau = 2, Manx = 7, Cymric = 5, Rat = 2, Mouse = 2, Hamster = 1 }  obj1

时间: 2024-10-06 03:22:57

【ThinkingInJava】31、对pet进行计数(3)的相关文章

【ThinkingInJava】32、递归计数

/** * 书本:<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.

Oracl常用e函数整理

最近学Oracle数据库,常常遇到Oracle数据库函数问题,经过默默地琢磨处理,总结了一些Oracle数据库常用函数. ------------------------------------ ---->oracle常用基本函数(附例子)<---- ------------------------------------ ------------------------ ---->常用的字符函数<---- ------------------------ --initap()单词

黑马程序员——Java基础——集合类

第一讲 集合 一.集合的概念: 集合时一种容器,长度可变,可以存储任意类型的对象,基本数据类型也能够装入,是因为其内部是先自动装箱包装成包装类对象,然后存入集合的: 对比数组:也是容器,长度固定,只能存储基本数据类型 二.集合的分类 主要掌握的集合: Collection List: |--ArrayList:底层的数据结构使用的是数组结构:查询快,增删慢,不同步 |-LinkedList:底层的数据结构使用的是链式结构:查询慢,增删快    |-Vector:底层数组结构:同步  Set: |

约瑟夫环的数组实现

1 /*约瑟夫环的实现*/ 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<time.h> 5 6 #define SIZE 10 7 #define STEP 5 8 9 void initArray(int arr[SIZE]); 10 void joseph_1(); 11 void joseph_2(); 12 13 int main() 14 { 15 joseph_2(); 16 return 0; 1

.NET基础回顾(三)

一. 里氏替换原则:LSP 定义:子类可以替换父类的位置,并且程序的功能不受影响(父类变量指向子类对象).因为父类有的功能子类都有,所以不影响程序的功能. 程序示例: 1 Person p = new Person(); 2 p.SayHi();//调用父类的 3 Student s = new Student(); 4 s.SayHi(); //调用子类的 5 //里氏替换原则 6 Person p1 = new Student(); 7 P1.SayHi(); //调用父类的 二. 类型转换

单件模式(Singleton Pattern)(转)

概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任. 从另一个角度来说,Singleton模式其实也是一种职责型模式.因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责! 意图

利用jdbc实现的宠物信息管理系统

一.需求: 利用jdbc实现对宠物的信息进行管理的一套系统 宠物信息:宠物ID,宠物类别,宠物名字,宠物性别,宠物年龄,宠物入库日期 系统完成功能:实现对宠物信息的录入,修改,删除,查询. 二.解决方案 一共创建了四个类: 1.一个宠物类PetMessage 里面是宠物的信息 2.一个是数据库连接类DBUtil  里面主要是完成数据连接功能 3.一个是宠物管理类PetDAO  完成对宠物信息的增删该查 4.最后一个就是一个测试类PetTest 完成对系统的测试 三.具体实现: 新建一个java项

程序员学炒股(7) 股指期货收盘价对第二天开盘价有影响吗?

很多微博和文章都说,股指期货的收盘价对第二天开盘价影响很大,因为股指多交易15分钟,因此对股市的第二天开盘价影响非常大,网上有一个文章是这样说的: “股指期货开盘早于股市15分钟,收盘又晚15分钟,国泰君安研究员曾统计,股指期货晚收盘15分钟的涨跌对于次日期指走势的预测准确率达到了70%.” 看看这个文章的作者是江恩艾略特道氏,虽然不知道是啥,但是看着还是很唬人的,再看看这篇文章的访问次数695567次,可见还是有影响力的. 如果这篇文章说的是真的话,能够预测到第二天开盘的大盘也是很不错滴,我们

BZOJ_1016_[JSOI2008]_最小生成树计数_(dfs+乘法原理)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1016 给出一张图,其中具有相同权值的边的数目不超过10,求最小生成树的个数. 分析 生成树的计数有一个什么什么算法... 我真的企图研究了...但是智商捉急的我实在看不懂论文... 所以最后还是写了暴力... 当然暴力也要靠正确的姿势的. 首先来看一个结论: 同一张图的所有最小生成树中,边权值相同的边的数目是一定的. 也就是说,假如某一张图的某一棵最小生成树由边权值为1,1,2,2,2,3的