分別使用序數和enummap的結果: 序數: test1() 使用enummap,tes1t ...
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