Javaの列挙型で次の要素を返す方法について

このQ&Aのポイント
  • Javaの列挙型で次の要素を返す方法について調査しました。
  • EnumMapやEnumSetというクラスを使うことで、次の要素を返すメソッドを簡単に実装できます。
  • 次の要素を返すメソッドや前の要素を返すメソッドは需要がありますが、Javaの標準では提供されていません。
回答を見る
  • ベストアンサー

列挙型:次の要素を返す?

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というクラスの記述に辿り着いたのですが、 このクラスを用いれば上述の「次の要素を返す」或いは「前の要素を返す」などの メソッドが準備されているのでしょうか。 前の要素を返すとか、次の要素を返すとかは結構需要がある気がするので、 そんなことはできない、ということはないと思うのですが…… 宜しくお願いします。

  • Java
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答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/LangSpec/TypesafeEnum/TypesafeEnum.html
jst123
質問者

お礼

回答ありがとうございます。 なるほど、一度配列に直してしまうのですね。 全く考えが及びませんでした…… おかげでソースもすっきりしましたし、疑問も解消されました。 ありがとうございます。

その他の回答 (2)

  • annyg2
  • ベストアンサー率50% (8/16)
回答No.3

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

jst123
質問者

お礼

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

回答No.1

Javaから離れて久しいのですが、enumのコンストラクタでは序数が暗黙的(?)に与えられるようです。 単純に定義順に前後が欲しいならこれを使うことが出来るのではないでしょうか。 そもそも列挙するだけなのでそれぞれの値の関係については実装する側で準備してやるべきだと思います。

jst123
質問者

お礼

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

関連するQ&A

  • javaによるenum型の扱い

    最近javaに親しんできたのですが、 Cとjavaにおける列挙型の扱いの違いに困っています。 javaにおけるenumはクラスであり、 各要素にメソッドを追加できることは分かったのですが…… 例えば、Cにおけるenumは確か、 typedef enum{EAST,SOUTH,WEST,NORTH} dirT; //定義 -------- (略) -------- dirT dir=EAST; //宣言・dirに要素EASTを格納 というようなことが出来たと思いますが、 javaはenumもクラスで、さらにnewでメモリ確保できないと聞きました。 つまり、このように列挙型の保持はできないということになるのでしょうか。 結局やりたいこととしては、このように「保持してある」列挙型に対して 条件分岐処理をしたいと考えています。 説明が上手くできず伝わりにくいかと思いますが、 どうか回答をお願いいたします。

    • ベストアンサー
    • Java
  • 英語の概念における相互の関係性について

    概念同士の関係性と定冠詞が使われる根拠についてこれから述べる私の説が正しいかどうかを判定してください。おかしいところがあればご指摘をお願いします。 lionとかtrainとか名づけられた概念は、語彙化されて文中で使われるようになりますが、ある時期から数えられるものには(a lionとかa trainというふうに)不定冠詞がつくようになりました。このことは、a lionとかa trainが一つのまとまりのあるもの(あるいは他の同種のものとの間に境界を持つもの)であることを示します。  逆に言えば、不定冠詞が登場する以前はlionもtrainも一まとまりのものと認知されにくかったことになります。とは言うものの、現実にlionもtrainも一まとまりのものであることは明白ですから、一まとまりのものであるにもかかわらず、まとまり切らないように感じられる何かを持っていたと思われます。おそらく、それは、他のものとのつながり(目に見えないつながり)だろうと思われます。関係性と言えば正確でしょうか。何らかのつながりがあって、それが切り離せないとき、一まとまりのものとみなすことはしにくいはずです。 もっと言えば、いかなる概念であっても必ず他の概念との間に大なり小なりの無数のつながりがあって、関係の網の目のようなものが存在するのではないかと思います。そうした関係のネットワークの中で、言語使用者がその都度の関心・興味に応じて、特定の関係性を一意的・優先的に見てとろうとするのではないかと思います。 例えば、eastと呼ばれる概念があったとして、その概念は他の概念との間に無数の関係のネットワークを持っているはずですが、その中で、言語使用者達が共同で、eastと同類の概念、つまりwest, south, northなどを同類項とみなし、{north, south, east, west}を一つの集合としてとらえ、生活の便宜のために利用したと考えられます。  {north, south, east, west}は概念の枠組みと言ってよいものですが、言語共同体の共有知識になったとき、north, south, east, west は4つしかないデフォルト要素なので、文中で使われるときにはどれにも定冠詞がつきます。あるいは4つの要素の相互の対照性から定冠詞がつくと考えてもいいはずです。デフォルト要素とは何かの構成要素であると人々が共通認識を持つものとしておきます。 このように、枠組みの要素が固定していて、かつ数の少ない場合は考えやすいのですが、そうでない場合はややこしくなります。 例えば、an oil paintingというtopicについてそこから関係性をたぐってみます。関係性は{north, south, east, west}の場合のような類似関係以外に、全体と要素の関係とか、上位カテゴリーと下位カテゴリーの関係とかいろいろ考えられます。 言語使用者の関心がカテゴリーに向かったときはたぶんこうなります。an oil paintingの上位カテゴリーはa paintingです。a paintingを上位カテゴリーとする下位カテゴリーはoil paintingとwatercolor paintingです。この2つはdefault要素なのでtheがつきます。または二項対立的にtheがつきます。このケースは簡明です。  言語使用者がan oil paintingから連想によって関係性をたぐっていった時、例えば[oil paints, palette, canvas, painter, picture dealer, art gallery, an exhibition ---}などが思い浮かびます。これらがdefault要素であるならtheがつきます。でも、これらがdefault要素であるかどうかは言語共同体において、おそらくおおざっぱに判定されているのではないかと思われます。もしかしたら、コーパスを使った研究によってdefaultは否かの判定が厳密になってきているかも知れません。 以上が私の説明ですがいかがでしょうか。

  • enumでの要素番号から要素名の取得方法

    こんにちは. java初心者です. 列挙型について勉強しています. 列挙型の中にファイル名を紐付けて利用したいと考えています. 要素名から要素番号を取得する方法はordinal()で出来ますが, その逆で,要素番号から要素名を取得する方法が調べても分かりませんでした. 具体的には,以下のソースで乱数を発生させ,その番号の要素名を取得する方法が知りたいです. よろしくお願いします. =========================== import java.util.Random; public class Sample { // 列挙型 enum Color{ RED("data1.txt"), BLUE("data2.txt"), GREEN("data3.txt"), NUM(""); private String name; Color(String name){ this.name = name; } public String getName(){ return name; } } public static void main(String args[]){ for(int i=0;i<10;i++){ Random rnd = new Random(); int id = rnd.nextInt(Color.NUM.ordinal()); // ランダム Color c = null; System.out.println("要素番号" + id + "の要素名は" /* + Colorのid番目の要素名 */ + "ファイル名は" + c.getName() + "です"); } } } ===========================

    • ベストアンサー
    • Java
  • heading south

    the stock was heading south 株価は下がっていた という表現を目にしたのですが、逆に株価が上がるはhead north になるのでしょうか? その他、head + 方角(east,west等)の表現で、特異な表現方法がありましたら、教えてください。

  • 次の文の英訳をお願いしますm(_ _)m

    From stratford in the north to Bath in the south and from Oxford in the east to Gloucester in the west, the Cotswolds is an area of historic sites, handsome towns and quiet, unspoilt villages with strange names such as Chipping Norton, Stow-on-the-Wold and The Slaughters.

  • 前置詞と方角

    前置詞と方角について質問があります。 a.The birds flew to the south.「南へ」 b.A warm wind was blowing from the south.「南から」 c.The sun rises in the east and sets in the west.「東から」「西へ」 aでは(from the north),bでは(to the north)と補って考えられるからto,fromを使うんだと自分で納得しました。 cでは,「AからBへ昇る(沈む)」と考えるとおかしいからto,fromは使わずに,「昇る」「沈む」それぞれの動作にそれぞれ「動作の方向」を示すinを使うんだと納得しました。 「起点」「到達点」が明確な場合from A to Bの形をとり(一方がしばしば省略される),そうでない場合はinを用いると考えたのですが The wind is in the north this morning.「北から」 この文はどう考えればよいでしょうか? もしくは僕の理屈づけが間違っていたら教えてほしいです。 あと,方角を示すときatが使われることはないのですか? 文が長くてすみません。

  • 例文の訳はこれでいいですか?

    連続の投稿ですみません。 また質問が出来てしまいました。 The author draws a comparison between East and West Germany and the North-South divide in England その著者は東ドイツと西ドイツを比べて、イングランドを南北に分ける。 と訳してみたのですが、どうにもおかしいような気がします。 添削お願いします。

  • Javaのメソッドやクラスを分かりやすく解説した本

    アルバイト先で新人社員のJAVA個別レッスンを頼まれました。 理解している、実行できる ・大体の文法 ・詳細設計書(Class名とそれに必要な要素)があればクラスは書ける。(形式に添ってクラスは書ける) ・オブジェクト指向は大体理解できている 出来ないこと 上のできる内容でClassは書けるとありましたが、 ・複数のClassを作るときに、それらに必要な要素を考えた事がありません。 ・複数のclassを作るときに、必要な全要素を出してあげても、どの要素がどのClassに必要か分からない。 ・Classは書けてもその中のメソッドを考えることができない。 ・引数がよく分かっていない。 この出来ないことを出来るようにするためには、 最初に、必要な要素を出してClassを作る練習 次に、Classに必要な要素を自分で考える練習 次に、メソッドの処理を日本語で出すのでJavaに置換える練習 次に、メソッドを最初から自分で書く練習 次に、引数について理解する・・・練習 が必要だと思います。 この部分だけを分かりやすく解説している本がないか探しています。 できれば本が良いのですが、WEBサイトでもかまいません。 どなたか同じように詰まった方がいらっしゃれば教えて下さい。 どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • ArrayListからの要素の取り出しについて

    質問いたします。 下記コードの目的は Textクラス内でTest.txtの読み込み・表示を行います 次にErrorクラス内では 【errorRead() 】Testクラスで発生する可能性があるエラーを記載したError.txtよりその内容を読み取りその内容をArrayListクラスのerrorListオブジェクトに格納しておきます。 【setErrorMsg】ではerrorListに格納された要素から必要なエラー表示を取り出す処理をしています。 質問は各クラスのメソッドで起こったエラーをキャッチした場合【setErrorMsg】メソッドへ対応する要素の番号を渡し、errorListよりgetメソッドを使い要素を取得しTestクラス内のcatch部分でその内容を表示させたいのですが、表示の仕方が良くわかりません。 class Test{ public static void main(String[] args){ try{ メソッドの呼び出し }catch(FileNotFoundException fnfe){ エラー内容の表示 }catch(IOException ie){ エラー内容の表示 } } class abc{ public voidTextRead() throws FileNotFoundException, IOException{ try{ 外部ファイルaaa.txtの読み込み、DOS画面への表示処理 }catch(FileNotFoundException){ error.setERROR_MESSAGE(0); }catch(IOException){ error.setERROR_MESSAGE(1); } } class Error{ public void errorRead() throws FileNotFoundException, IOException{ ArrayList errorList = new ArrayList(); try{ BufferedReader br = new BufferedReader(new FileReader("Error.txt")); while((errorStr = br.readLine()) !=null){ errorList.add(errorStr); } br.close(); }catch(FileNotFoundException fnfe){ setERROR_MESSAGE(3); }catch(IOException ie){ error.setERROR_MESSAGE(4); } public int setErrorMsg(int count){ errorList.get(count); return count; } } 宜しくお願い致します。

    • ベストアンサー
    • Java
  • コンパイルできません。

    public class test17{ double[] ary; /** *実数型の配列を引数にしたコンストラクタ */ public test17(double[] a){ } /** *要素の合計を求めるメソッド */ public double sum(){ } /** *要素の平均を求めるメソッド */ public double average(){ } /** *要素の最大値を求めるメソッド */ public double max(){ } /** *要素の最小値を求めるメソッド */ public double min(){ } /** *値を要素に持っているかどうかを確認するメソッド */ public boolean hasElement(double d){ } } kouzou@GD348ZZD9:/WORK$ javac test17.java test17.java:16: エラー: return文が指定されていません } ^ test17.java:23: エラー: return文が指定されていません } ^ test17.java:28: エラー: return文が指定されていません } ^ test17.java:35: エラー: return文が指定されていません } ^ test17.java:41: エラー: return文が指定されていません } ^ エラー5個

    • ベストアンサー
    • Java

専門家に質問してみよう