プロが教えるわが家の防犯対策術!

javaで次のようなクラスを作りました。

import java.util.*;
public class sample {
enum Wind{
EAST,SOUTH,WEST,NORTH;

Wind next(Wind w){
switch(w){
case EAST:return SOUTH;
case SOUTH:return WEST;
case WEST:return NORTH;
case NORTH:return EAST;
}
return null;
}
}

public static void main(String[] args) {
Wind w = Wind.EAST;
w=w.next(w);
System.out.printf("%d",w.ordinal());
}
}

ここで、next()メソッドは今自分が持っている要素の次の要素を返すメソッドですが、
標準でこのようなメソッドはないのかと疑問に思いました。
今回は4つだったので良かったのですが、
これが100個の要素だったりすれば一つ一つ書くのは馬鹿げていると思います。

色々調べているうちに、EnumMapやEnumSetというクラスの記述に辿り着いたのですが、
このクラスを用いれば上述の「次の要素を返す」或いは「前の要素を返す」などの
メソッドが準備されているのでしょうか。

前の要素を返すとか、次の要素を返すとかは結構需要がある気がするので、
そんなことはできない、ということはないと思うのですが……

宜しくお願いします。

A 回答 (3件)

Enum では、要素を ordinal の順番で並べた配列が values() メソッドで取得できます。


これを使えば switch に一つ一つの条件を書かなくてもよいかと。
なお、 values() は static メソッドです。

例) ------------------------------------------------------
Wind next(Wind w) {

Wind[] vals = values();
int nextOrd = w.ordinal() + 1;
return nextOrd < vals.length ? vals[nextOrd] : vals[0];
}
----------------------------------------------------------


ちなみに、引数無しで自分自身の次を返した方がスッキリするかも知れません。

例) ------------------------------------------------------
Wind next() {

Wind[] vals = values();
int nextOrd = ordinal() + 1;
return nextOrd < vals.length ? vals[nextOrd] : vals[0];
}
----------------------------------------------------------

参考URL:http://www.javainthebox.net/laboratory/J2SE1.5/L …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

なるほど、一度配列に直してしまうのですね。
全く考えが及びませんでした……

おかげでソースもすっきりしましたし、疑問も解消されました。
ありがとうございます。

お礼日時:2010/12/11 14:23

そういう仕組みはあるにはあります。


EnumSetならAbstrctCollectionインターフェースを実装しているんで、toArray()メソッドで配列にすることができますし、iterator()メソッドでイテレータを取得することもできます。(ので、要素を順番にとることができます)
というか、こういうことがしたいのであれば、最初から配列を使うべきで、enumを使うこと自体が適していない気がします。
余談ながら、C言語でenumを間違って使っていた人はJavaでもこういうことをする傾向があるように思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
あるにはあるんですね。

余談の方が気になるのですが、enumを間違って、とは
ふつう列挙型は序数による前後関係を利用するべきではない、ということでしょうか。
恥ずかしながら、Cでもこのような書き方をよくしていました……

お礼日時:2010/12/11 14:19

Javaから離れて久しいのですが、enumのコンストラクタでは序数が暗黙的(?)に与えられるようです。


単純に定義順に前後が欲しいならこれを使うことが出来るのではないでしょうか。

そもそも列挙するだけなのでそれぞれの値の関係については実装する側で準備してやるべきだと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
色々試してみます。

お礼日時:2010/12/11 14:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!