zoukankan      html  css  js  c++  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

  • 相关阅读:
    《Java从入门到精通》第十三章学习笔记
    Java实训项目--影碟管理软件
    《Java从入门到精通》第十二章学习笔记
    《Java从入门到精通》第十一章学习笔记
    《Java从入门到精通》第十章学习笔记
    《Java从入门到精通》第九章学习笔记
    Swift游戏实战-跑酷熊猫 02 创建熊猫类
    Swift游戏实战-跑酷熊猫 01 创建工程导入素材
    Swift游戏实战-跑酷熊猫 00 游戏预览
    Swift游戏实战-跑酷熊猫(一) 简介 (含源代码)
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5906458.html
Copyright © 2011-2022 走看看