首页 > 代码库 > 【Effective Java】9、使用EnumMap代替序数索引
【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
【Effective Java】9、使用EnumMap代替序数索引
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。