你的位置:首页 > Java教程

[Java教程]【Effective Java】9、使用EnumMap代替序数索引


package cn.xf.cp.ch02.item33;import java.util.EnumMap;import java.util.HashSet;import java.util.Map;import java.util.Set;import org.junit.Test;/** * *功能:序数索引 *时间:下午4:24:48 *文件:HerbOld.java *@author Administrator * */public class HerbOld{  public enum Type  {    ANNUAL, PERENNIAL, BIENNIAL  }    private String  name;  private Type  type;    /**   * 包区权限   * @param name   * @param type   */  HerbOld(String name, Type type)  {    this.name = name;    this.type = type;  }    @Override  public String toString()  {    return name;  }  public String getName()  {    return name;  }  public void setName(String name)  {    this.name = name;  }  public Type getType()  {    return type;  }  public void setType(Type type)  {    this.type = type;  }  }

 

分别使用序数和enummap的结果:

package cn.xf.cp.ch02.item33;import java.util.EnumMap;import java.util.HashSet;import java.util.Map;import java.util.Set;import org.junit.Test;import cn.xf.cp.ch02.item33.HerbOld.Type;public class HerbTest{  @Test  public void tes1t()  {    HerbOld garden[] =    { new HerbOld("Basil", Type.ANNUAL), new HerbOld("Carroway", Type.BIENNIAL), new HerbOld("Dill", Type.ANNUAL),        new HerbOld("Lavendar", Type.PERENNIAL), new HerbOld("Parsley", Type.BIENNIAL),        new HerbOld("Rosemary", Type.PERENNIAL) };    // 使用map,键存放类型,值存放集合,enumMap是map中专门用于枚举键的    Map<HerbOld.Type, Set<HerbOld>> herbsByType = new EnumMap<HerbOld.Type, Set<HerbOld>>(HerbOld.Type.class);        //创建全部类型的集合    for (HerbOld.Type t : HerbOld.Type.values())      herbsByType.put(t, new HashSet<HerbOld>());    for (HerbOld h : garden)      herbsByType.get(h.getType()).add(h);    System.out.println(herbsByType);  }  
  
   @Test public void test1() { HerbOld garden[] = { new HerbOld("Basil", Type.ANNUAL), new HerbOld("Carroway", Type.BIENNIAL), new HerbOld("Dill", Type.ANNUAL), new HerbOld("Lavendar", Type.PERENNIAL), new HerbOld("Parsley", Type.BIENNIAL), new HerbOld("Rosemary", Type.PERENNIAL) }; // 在使用这个类的集合的时候,我们有三种这个类型,所以要分开集合,三个集合表示ANNUAL, PERENNIAL, // BIENNIAL三种type // 创建相对应数量的数组 Set<HerbOld> herbsByType[] = (Set<HerbOld>[]) new Set[HerbOld.Type.values().length]; // 对应的set类型创建对应的set集合 for (int i = 0; i < herbsByType.length; ++i) { herbsByType[i] = new HashSet<HerbOld>(); } // 根据枚举类型的位置来判定相应类型集合的位置,并把数据添加进去 for (HerbOld ho : garden) { // ordinal,这个返回对应枚举类型在声明的时候的位置 herbsByType[ho.getType().ordinal()].add(ho); } // 遍历 for (int i = 0; i < herbsByType.length; ++i) { // 这里这个是可以运行的 /** * 但是这里要注意: 当你访问一个按照枚举的序数进行索引的时候,明确知道int类型代表枚举的那个类型你就得好好想想了, * 如何正确使用int对应的集合类型是对应那个 * 而int并不能提供枚举类型的安全。如果你使用了错误的值,那么程序就会悄悄的完成意料之外的工作 */ System.out.printf("%s: %s%n", HerbOld.Type.values()[i], herbsByType[i]); } }}

序数:

test1()

 

使用enummap,tes1t

 




韩国旅游护照签证韩国旅游路线报价费用韩国旅游哪里好玩呢韩国旅游签证怎么办理韩国旅游去哪好2015东部华侨城圣诞节夜场活动时间?深圳东部华侨城圣诞夜场几时开始? 2015东部华侨城圣诞节夜场活动门票预订价格?深圳东部华侨城圣诞夜场门票多少钱? 2015广州长隆大马戏圣诞节夜场活动时间?长隆大马戏圣诞夜场几时开始? 2015广州长隆大马戏圣诞节夜场活动门票预订价格?长隆大马戏圣诞夜场门票多少钱? 迪拜奢华购物攻略 香港旅游住宿哪里比较便宜而且服务卫生好? 去柬埔寨旅游该买什么特产? 学生族旅游盘点!学生族中最具影响力的十大国内旅游圣地 紫牵牛花奏响马峦山夏日乐章 大沙河公园看夏日“黄金雨” 探秘园博园藏匿于湖畔的美景 笔架山灰莉淡雅盛开惹人爱 香山怎么去_香山在哪里 马尔代夫卡尼岛旅游攻略_满月岛地理位置|房型|最佳旅游时间|注意事项 马尔代夫:上帝抛洒人间的项链 玉佛寺门票_玉佛寺门票价格_上海玉佛寺门票多少钱 TLRMH1106(T11) Datasheet TLRMH1106(T11) Datasheet TLRMH151 Datasheet TLRMH151 Datasheet TLRMH151(T) Datasheet TLRMH151(T) Datasheet 孟买是哪个国家的 孟买是哪个国家的 孟买是哪个国家的 武汉极地海洋世界地址 武汉极地海洋世界地址 武汉极地海洋世界地址 灵隐寺在哪 灵隐寺在哪 灵隐寺在哪