
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というクラスの記述に辿り着いたのですが、
このクラスを用いれば上述の「次の要素を返す」或いは「前の要素を返す」などの
メソッドが準備されているのでしょうか。
前の要素を返すとか、次の要素を返すとかは結構需要がある気がするので、
そんなことはできない、ということはないと思うのですが……
宜しくお願いします。
No.2ベストアンサー
- 回答日時:
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 …
回答ありがとうございます。
なるほど、一度配列に直してしまうのですね。
全く考えが及びませんでした……
おかげでソースもすっきりしましたし、疑問も解消されました。
ありがとうございます。
No.3
- 回答日時:
そういう仕組みはあるにはあります。
EnumSetならAbstrctCollectionインターフェースを実装しているんで、toArray()メソッドで配列にすることができますし、iterator()メソッドでイテレータを取得することもできます。(ので、要素を順番にとることができます)
というか、こういうことがしたいのであれば、最初から配列を使うべきで、enumを使うこと自体が適していない気がします。
余談ながら、C言語でenumを間違って使っていた人はJavaでもこういうことをする傾向があるように思います。
回答ありがとうございます。
あるにはあるんですね。
余談の方が気になるのですが、enumを間違って、とは
ふつう列挙型は序数による前後関係を利用するべきではない、ということでしょうか。
恥ずかしながら、Cでもこのような書き方をよくしていました……
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
0歳児の指しゃぶりに関して
-
final修飾子を使っているのに、...
-
処理内容がほぼ同じメソッドの...
-
【sendkeysメソッドが動かずに...
-
VBA コピーが出来ません…!
-
mainメソッドのthrows節で設定...
-
VBPをダブルクリックするとたま...
-
エクセルVBAにおけるON TIMEメ...
-
VB.netで、シリアル通信のタイ...
-
vbaエクセルマクロ RemoveDupli...
-
Labelコントロールに数字を代入...
-
vbaエクセルマクロ RemoveDupli...
-
C# 演算 最大値 最小値 表現の仕方
-
ExcelVBA Findメソッドで検索の...
-
javaでの日付の大小比較について
-
CALLされていないメソッドを見...
-
DAOのExcelVBAにてAccessのデー...
-
日本の教育って時間が無い中で...
-
VB6と2008、SQL使用方法の違い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
【sendkeysメソッドが動かずに...
-
コマンドプロンプト実行後に画...
-
VBA コピーが出来ません…!
-
ウィンドウを最前面にできません
-
JSPで<SELECT>の中にDBから持っ...
-
javascriptからjavaを呼び出したい
-
VBPをダブルクリックするとたま...
-
eclipse-Tomcatでのデバッグに...
-
Application.Wait の参照設定
-
エクセルVBAにおけるON TIMEメ...
-
配列のメソッド
-
エクセルのマクロでプリンタを...
-
final修飾子を使っているのに、...
-
drawStringで文字間隔の調整
-
Excel VBA でExcelを終了したい...
-
worksheets & rows メソッドは...
-
CALLされていないメソッドを見...
-
vbaエクセルマクロ RemoveDupli...
おすすめ情報