- ベストアンサー
Javaの列挙型で次の要素を返す方法について
- Javaの列挙型で次の要素を返す方法について調査しました。
- EnumMapやEnumSetというクラスを使うことで、次の要素を返すメソッドを簡単に実装できます。
- 次の要素を返すメソッドや前の要素を返すメソッドは需要がありますが、Javaの標準では提供されていません。
- みんなの回答 (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]; } ----------------------------------------------------------
その他の回答 (2)
- annyg2
- ベストアンサー率50% (8/16)
そういう仕組みはあるにはあります。 EnumSetならAbstrctCollectionインターフェースを実装しているんで、toArray()メソッドで配列にすることができますし、iterator()メソッドでイテレータを取得することもできます。(ので、要素を順番にとることができます) というか、こういうことがしたいのであれば、最初から配列を使うべきで、enumを使うこと自体が適していない気がします。 余談ながら、C言語でenumを間違って使っていた人はJavaでもこういうことをする傾向があるように思います。
お礼
回答ありがとうございます。 あるにはあるんですね。 余談の方が気になるのですが、enumを間違って、とは ふつう列挙型は序数による前後関係を利用するべきではない、ということでしょうか。 恥ずかしながら、Cでもこのような書き方をよくしていました……
- いけだ ひろし(@ike-2000)
- ベストアンサー率53% (69/129)
Javaから離れて久しいのですが、enumのコンストラクタでは序数が暗黙的(?)に与えられるようです。 単純に定義順に前後が欲しいならこれを使うことが出来るのではないでしょうか。 そもそも列挙するだけなのでそれぞれの値の関係については実装する側で準備してやるべきだと思います。
お礼
回答ありがとうございます。 色々試してみます。
お礼
回答ありがとうございます。 なるほど、一度配列に直してしまうのですね。 全く考えが及びませんでした…… おかげでソースもすっきりしましたし、疑問も解消されました。 ありがとうございます。