在本实验中,你将体验使用Java的HashMaps和枚举数据类型。你将实现一些不同的枚举类,其中一个以定制类作为值。在Driver类中,你将创建几个不同的HashMaps - 其中一个将字符串映射到枚举数据类型,另一个在枚举类型的不同值之间进行映射。另外,你的实现将对一个HashMap进行遍历。
完成本实验后,你应该能够:
- 创建一个枚举数据类型
- 创建并添加项到一个HashMap
- 使用Key从HashMap中取值
- 遍历一个HashMap并打印信息
将现有的lab8实现导入到你的eclipse工作区,
- 下载lab8实现
- 在Eclipse中,选择File/Import
- 选择General/Existing projects into worksapce,点击Next
- 选择Select archive file,导航到lab8.zip文件,点击Finish
下面是本实验的UML表示,你的任务是实现这些类,并编写相应的单元测试。
本实验中我们只会用到如下Pokemon:Bulbasaur(妙蛙种子),Charmander(小火龙),Squirtle(杰尼龟)。pokemonMap这个HashMap中用到的keys分别是Pokemon名字的三字母简写:BLB,CHR,和SQR。本实验中三个Pokemon的属性表示如下:
- BULBASAUR:性格 - RELAXED,类型 - GRASS
- CHARMANDER:性格 - BRAVE,类型 - FIRE
- SQUIRTLE:性格 - QUIET,类型 - WATER Pokemon的类型对其战斗力有很大影响,某些类型之间有相互克制作用,如下表定义:
类型 | 克制类型 |
---|---|
Fire | Grass |
Water | Fire |
Grass | Water |
表1:类型克制表 |
如果还未创建,请先按UML所示创建Nature,Pokemon,PokemonType,PokemonInfo和Driver类,
- 确保类名和UML一致
- 你必须使用缺省包,也就是说包字段必须是空
为每个类实现属性和方法
- 我们建议你从类分级的底部开始:先实现不依赖于其它类的类
- 实例变量和方法名的命名按照UML所示
- 除UML规范以外,不要为类增加额外的功能
- 不要忘记添加注释文档!
创建JUnit测试类,对你的所有代码进行全面测试
- 确保所有功能正确
- 确保所有类和方法被测试覆盖。
该枚举具有如下成员:BRAVE,QUIET,RELAXED。
- toString():该方法返回特定枚举成员的小写名称
该枚举有如下成员:FIRE,GRASS,WATER。
PokemonType枚举类型包含所有可能的Pokemon类型的一个子集(实验中我们只用了三个,实际上远不止这些)。
如前所述,Pokemon的类型影响其战斗力,类型之间有相互克制关系。为了表达类型成员之间的弱/强相互克制关系,我们用两个HashMaps存储这些关系:strengthMap和weaknessMap。strengthMap表达某个类型和它强克制的类型之间的映射,weaknessMap表达某个类型和它弱克制的类型之间的关系。
为了只创建和填充这些maps一次,同时又能访问maps中的枚举成员,我们将对maps的引用标记为静态static - 这些引用也被标记为final,表明是常量不能修改。对strengthMap和weaknessMap的初始化应该在静态初始化器static initiaizer中完成。一个静态初始化器是一个代码块,类被Java加载时,其中的静态初始化器仅被运行一次。静态初始化器的执行在静态变量声明之后,其它代码初始化之前 - 你可以把它看成是类本身的构造函数,而不是单个类实例的构造函数。
因为静态初始化器只运行一次,也只是被Java内部调用,你无需像其它方法一样给它一个名称,因为它无法被其它代码所调用。一个静态初始化方法的例子如下:
class Foo // Some class
{
static { // This is the static initializer for class Foo
{
. . . // Code goes here
}
}
HashMaps中的映射关系见上面的表1.
要实现的实例方法如下:
- effectiveAgainst():该方法返回这个特定PokemonType所克制的PokemonType。
- weakAgainst():该方法返回这个特定PokenmonType所弱克制的PokemonType。
- toString():该方法返回特定枚举成员的小写名称。
该类包含某个特定Pokemon的信息,包括:Pokemon的性格Nature和类型PokemonType。
- Pokemon constructor:该构造函数接受一个Nature输入和一个PokemonType输入,并将它们赋予恰当的实例变量,
- getNature():该方法返回某个PokemonInfo实例的Nature,
- getPokemonType():该方法返回某个PokemonInfo实例的PokemonType,
- toString():该方法返回如下格式的PokemonInfo实例的信息:
a <NATURE> <POKEMON_TYPE> type
其中是实例中存储的Nature,<POKEMON_TYPE>是实例中存储的PokemonType。如果Nature是BRAVE,PokemonType是WATER,那么输出如下:
a brave water type
Pokemon枚举是所有可能Pokemon的一个子集,该枚举有如下成员:BULBASAUR,CHARMANDER和SQUIRTLE。
- Pokemon constructor:该构造函数接受一个PokemonInfo实例并存入恰当的实例变量,
- getNature():该方法返回Pokemon的Nature,
- getPokemonType():该方法返回Pokemon的PokemonType,
- toString():该方法返回Pokemon的描述字符串,格式如下:
<NAME>: a <NATURE> <POKEMON_TYPE> type
其中<NAME>是Pokemon的名称,第一个字母大写,其余小写,<NATURE>和<POKEMON_TYPE>已经在上面Pokemon枚举中描述过。对于一个Pokemon BULBASAUR,QUIET Nature,PokemonType GRASS,返回字符串如下:
Bulbasaur: a quiet grass type
Driver类创建和初始化一个HashMap,key为字符串,value为Pokemon枚举。它也提示用户是对HashMap中的单个还是一组Pokemon输出信息。如果用户选择单个,那么程序就输出指定Pokemon的信息,如果用户选择一组,那么HashMap中的所有Pokemon的信息都被输出。
- 主菜单
Professor Oak, the Pokemon professor, presents you with three pokeballs and tells you that you can choose one as your first Pokemon!
Please select an option:
1: Choose a Pokemon
2: List all Pokemon
- Pokemon选择菜单
Please choose from the folloing Pokemon: [SQR, BLB, CHR]
注意:集合是无序的,所以Pokemon列表可能是任意顺序。
请使用BufferedReader接收用户输入。你的代码需要处理用户输入的任何选择,例如,非1和2的数字,字母,未列出的Pokemon,等等。如果输入不正确,你的程序必须重新提示用户输入,直到输入正确。
一旦获得了用户的所有必要输入,你的程序必须打印选定(或所有)Pokemon的信息,最后退出。
Professor Qak, the Pokemon professor, presents you with three pokeballs - and tells you that you can choose one as your first Pokemon!
Plese select an option:
1: Choose a Pokemon
2: List all Pokemon
1
Please choose from the following Pokemon: [SQR, BLB, CHR]
SQR
You choose Squirtle: a quiet water type.
Your water type Pokemon is weak against grass types and strong against fire types.
Professor Qak, the Pokemon professor, presents you with three pokeballs - and tells you that you can choose one as your first Pokemon!
Plese select an option:
1: Choose a Pokemon
2: List all Pokemon
2
SQR - Squirtle: a quiet water type.
BLB - Bulbasaur: a relaxed grass type.
CHR - Charmander: a brave fire type.
使用Eclipse生成Javadoc
- 选择Project/Generate Javadoc...
- 确保你的项目被选中,包括所有的Java文件
- 选择Private可见性
- 使用缺省的目标目录
- 点击Finish
在Eclipse或者你常用的浏览器中打开lab8/doc/index.html文件。 确保Javadoc中包含你的类,所有的方法包含必要的Javadoc文档。
所有枚举类型都自动提供一个*name()*实例方法,它返回一个枚举值的String描述。特别的,它和你用来描述枚举值的字符串一样。