假设有如下类Food(食物),枚举类Type定义Food的类型:
public class Food { public enum Type{FRUIT,VEGETABLE} private final Type type; private final String name; public Food(String name,Type type){ this.name=name; this.type=type; } public String getName(){ return name; } public Type getType(){ return type; } }
以下数组包含了多种食物,如下:
private Food[] foods; @BeforeClass public void init(){ Food apple=new Food("apple",Type.FRUIT); Food pear=new Food("pear",Type.FRUIT); Food cabbage=new Food("cabbage",Type.VEGETABLE); Food potato=new Food("potato",Type.VEGETABLE); foods=new Food[]{apple,cabbage,pear,potato}; }
假设现在需要根据Food类型对其进行分类,把相同类型的Food放入同一个HashSet对象里,其中一种做法如下:
@Test public void testFood(){ //根据Food类型分类,存放到相应的Set里 Set<Food>[] foodsByType=new Set[Type.values().length]; for(int i=0,len=foodsByType.length;i<len;i++) foodsByType[i]=new HashSet<Food>(); for(Food food:foods){ //使用了Type枚举量的ordinal()作为索引值,取出相应的Set对象 foodsByType[food.getType().ordinal()].add(food); } for(Type type:Type.values()){ Set<Food> foods=foodsByType[type.ordinal()]; for(Food food:foods) Assert.assertEquals(food.getType(), type); } }
以上代码其中一个缺点是只能使用int类型的索引值从数组里取出相应的HashSet对象,可能导致ArrayIndexOutOfBoundsException异常。另一种更好的做法如下:
@Test public void testFoodMap(){ Map<Type, Set<Food>> foodsByType=new EnumMap<Food.Type, Set<Food>>(Type.class); for(Type type:Type.values()) foodsByType.put(type, new HashSet<Food>()); //使用Type枚举量做为key值 for(Food food:foods) foodsByType.get(food.getType()).add(food); for(Type type:Type.values()){ Set<Food> foods=foodsByType.get(type); for(Food food:foods) Assert.assertEquals(food.getType(), type); } }
以上代码EnumMap使用枚举量Type作为key,因此更不容易出错。EnumMap底层使用数组维护key,因此与第一种做法在性能上相差无几。
相关推荐
DEV JLink V6.33a x32 便携版 DEV JLink V6.33a x32 Portable
InternetDownloadManager-v6.33.2 InternetDownloadManager-v6.33.2
stc-isp-15xx-v6.33
Internet Download Manager 6.33.2(IDM6.33.2)下载器便携版
同创新佳 RF卡管理系统 单机版V6.33分享一下
强大的下载软件,可解析网页中的视频,音频等,强烈推荐 !比迅雷等下载器好用多了谁用谁知道! 不止下载文件那么简单!解析网站上的文件.js.css.... 安装好后切换到简体中文就能体验飞一般的速度!
NC手册是用友建筑的产品。里面包含安装步骤。
Internet_Download_Manager_6.33_Build_3_Retail_Downloadly.ir.rar
pos58 打印机 WIN7驱动好用 V6.33.rar
荣耀电脑驱动MagicBook_2019_锐龙版_电脑管家_9.1.6.33
Excel高手6.33.1545 支持2000 2003 2007
Boilsoft Video Splitter 可快速精准(精确到毫秒)的为您分割音视频文件,内置视频预览功能,支持时下流行的多媒体格式: 3GP, AVI, MPG, MPA, VOB, RM, RMVB, MP4, Windows Media file(.asf, .wmv, .wma)...
Ros 6.33.3 最新虚拟机版,可用于 vmware workstation 或 esxi ,L6许可
google浏览器绿色插件 green chrome 6.33
Color7MusicEditor_6.33.rar
软件介绍 可免受到电脑病毒的侵害,有效的保护个人电脑以及工作站的使用,它可以检测并移除超过50,000种病毒,支持网络更新 Tags: AntiVir Personal v6.33.01.03
鼎鼎大名的下载软件,多线程极速下载。 已学习版本。
分割速度最快的媒体分割器,既可分割视频文件,也可分割音频文件。
防火墙会实时拦截插入的USB设备,对其进行检测,如果发现有病毒,则会启动杀毒引擎进行查杀和修复,进而自动弹出USB设备,正常情况下,再次插入USB设备即可正常使用。同时,扩展强化的桌面功能(如老板键,支持鼠标...
stc较高版本,是将程序烧录到单片机的必备工具