EnumMap

enummap.png

EnumMapの良い所

  • 高速
  • hashCode()をオーバーロードしなくても、要素にenumのあるクラスにしておけば勝手にソートしてくれる。

配列のインデックスの代わりにEnumMapを使う

ハーブを表すクラスを作ったとする。

package enumclass;
 
public class Herb {
    public enum Type{ANNUAL,PERENNIAL,BIENNIAL}//1年生植物、多年生植物、二年生植物
    private final String name;
    public final Type type;
    public Herb(String name,Type type){
        this.name=name;
        this.type=type;
    }
    @Override public String toString(){
        return name;
    }
 
}

こうしておけば、Setに入れた時、勝手にType別に分類してくれるわ。
配列を使ったダメな例 EnumMapを使った良い例
import java.util.*;
import enumclass.*;
 
class Main {
    public static void main(String[] args) {
        Herb[] garden={new Herb("ラベンダー",Type.PERENNIAL),new Herb("バジル",Type.ANNUAL),
                new Herb("パセリ",Type.BIENNIAL),new Herb("ミント",Type.PERENNIAL),
                new Herb("コリアンダー",Type.ANNUAL)
        };
        //Herb.Type.ordinal()でインデックスされる
        Set<Herb>[] herbsByType=(Set<Herb>[])new Set[Herb.Type.values().length];
        for(int i=0;i<herbsByType.length;i++){
            herbsByType[i]=new HashSet<Herb>();
        }
        for(Herb h:garden){
        //配列をインデックスするのにordinal()を使用。これをやってはいけない!
            herbsByType[h.type.ordinal()].add(h);
        }
        for(int i=0;i<herbsByType.length;i++){
            System.out.printf("%s:%s%n",Herb.Type.values()[i],herbsByType[i]);
        }
    }
 
}
import java.util.*;
import enumclass.*;
 
class Main {
    public static void main(String[] args) {
        Herb[] garden={new Herb("ラベンダー",Type.PERENNIAL),new Herb("バジル",Type.ANNUAL),
                new Herb("パセリ",Type.BIENNIAL),new Herb("ミント",Type.PERENNIAL),
                new Herb("コリアンダー",Type.ANNUAL)
        };
        //データをenumと関連付けるためにEnumMapを使用する
        Map<Herb.Type,Set<Herb>> herbsByType=new EnumMap<Herb.Type,Set<Herb>>(Herb.Type.class);
        for(Herb.Type t: Herb.Type.values()){
            herbsByType.put(t, new HashSet<Herb>());
        }
        for(Herb h:garden){
            herbsByType.get(h.type).add(h);
        }
        System.out.println(herbsByType);
 
    }
 
}
ANNUAL:[バジル, コリアンダー]
PERENNIAL:[ラベンダー, ミント]
BIENNIAL:[パセリ]
{ANNUAL=[バジル, コリアンダー], PERENNIAL=[ミント, ラベンダー], BIENNIAL=[パセリ]}
Bibliography

サポートサイト Wikidot.com