2012-01-02 7 views
1

だから、私は最近this postを読んで、効果的に同じことをしたいと思います。私が行うときに、それに伴う問題は、if文であり、列挙型と文字列のマッピングですか?

public enum Day { 

    Monday(1), 
    Tuesday(2), 
    Wednesday(3), 
    Thursday(4), 
    Friday(5), 
    Saturday(6), 
    Sunday(7); 

    public final int id; 

    Day(int id) { 
     this.id = id; 
    } 

    public static Day getByID(int id) { 
     Day d = null; 
     for (Day dTemp : Day.values()) 
     { 
      if (id == dTemp) 
      { 
       d = dTemp; 
       break; 
      } 
     } 

     return d; 
    } 

    public Day getNext() { 
     return values()[(ordinal()+1)%values().length]; 
    } 

    public Day getPrev() { 
     return values()[(ordinal()-1)%values().length]; 
    } 
} 

:しかし

私は本当になど、「醜さ」を気にしませんでしたので、私はそうのような方法のいずれかを実施し

if (id == dTemp) 

互換性のないタイプです。それを修正するために私は何をすべきですか?

+1

お試しください 'id == dTemp.id' –

+1

あなたはC#、私の子供に誤解しましたか? (http://msdn.microsoft.com/en-us/library/cc138362.aspx) –

答えて

2

if (id == dTemp.id)を使用してください。列挙型はクラスであり、列挙型の値はintではないオブジェクトなので、intに(明示的にも暗示的にも)キャストできません。

また、列挙型に序数、つまりその位置のIDがあることに注意してください。あなたの例では、Mondayは序数0を持ち、Sundayは序数6を持ちます。ordinal()メソッドを呼び出して序数にアクセスします。したがって

idでは、次の代わりに行うことができますベースのいずれかの場合:あなたは、配列をキャッシュされたプライベート静的変数とアクセスにDay.values()をキャッシュする場合があります

public static Day getByID(int id) { 
    //check id is between 1 and 7, I'll leave that for you 
    return Day.values()[id - 1]; 
} 

注意を。

Btw、あなたの質問で言及した文字列はどこですか?

+0

FYI、Bhaxyは既に序数()を使用して翌日と前日を取得しています。 –

+0

@TheNailはい、私もそれを見ました。私はなぜ彼が静的な方法でそれを使用していないのだろうかと思う。 – Thomas

1
if(id == dTemp.id) 


またenumordinal()方法を試してください。

public final int ordinal()この列挙定数の序数(その列挙宣言の、初期定数に0の序数が割り当てられている位置)を返します。ほとんどのプログラマーはこのメソッドを使用しません。 EnumSetやEnumMapなどの洗練されたenumベースのデータ構造で使用するように設計されています。

戻り値: この列挙定数の序数。 See


まあ、私はあなたのコードをコピーし、それに応じてテストしました。

両方

if (id == dTemp.ordinal()+1) 

if(id == dTemp.id) 

予想通り微細で生成働きました。声明

System.out.println(Day.Friday.getByID(1)); 

が生成月曜日

関連する問題