Улічваючы колькасную значэнне пэўнага тыпу пералікаў, як я магу атрымаць імя?

Я спрабую наладзіць маё пералік так, што ў яго ёсць спіс імёнаў і атрымаць пэўную імя, улічваючы, што значэнне.

прыклад: пералік {ваніль, шакалад, клубніцы};

Улічваючы 0, вяртанне ванілі. Улічваючы 1, вярнуцца шакалад. Улічваючы 2, вяртанне трускаўкі.

Я не змог знайсці якія-небудзь метады, якія прыходзяць з класам Java Enum, каб зрабіць гэта з скрынкі. Я маю на ўвазе пісаць мае ўласныя, што скідае значэння ў масіў, а затым выкарыстоўваць бінарны пошук, каб вярнуць іх, улічваючы канкрэтнае лік.

Ці ёсць што-то пабудавана ў, аднак, што было б лепш?

Дзякуй!

0

7 адказы

Вы павінны рэалізаваць яго ў Enum. Як гэта:

public enum MyEnum {
  VANILLA(0), CHOCOLATE(1), STRAWBERRY(2);

  private int i;

  private MyEnum(int i) {
     this.i = i;
  }

  public static MyEnum getFoodById(int id) trhows IllegalArgumentException {
     MyEnum result = null;
     switch (id):
       case 0: {
         result = MyEnum.VANILLA;
         break;
       }
       case 1: {
         result = MyEnum.CHOCOLATE;
         break;
       }
       case 2: {
         result = MyEnum.STRAWBERRY;
         break;
       }
       default : { 
          throw new IllegalArgumentException("Invalid id ...");
       }
   }
   return result;
}
3
дададзена
Канешне. Прагаласаваць уверх :)
дададзена аўтар Konstantin Yovkov, крыніца
Дзякуй, што ты маеш рацыю. Я абнавіў адказ. :)
дададзена аўтар Konstantin Yovkov, крыніца
Я згодзен. Проста напісаў так для канкрэтнага выпадку. :)
дададзена аўтар Konstantin Yovkov, крыніца
+1 для правільнага падыходу.
дададзена аўтар Ravi Thapliyal, крыніца
Гэта не будзе працаваць ... на самай справе нават скампіляваць для гэтага важна. <�Код> я ў выключальніку павінен быць ідэнтыфікатар .
дададзена аўтар Jonathan Drapeau, крыніца
Ці можаце вы сказаць мне, што профі/мінусы над гэтым падыходам над для цыклу (як у маім адказе ніжэй)? Маючы дадаць выпадак, кожны раз, калі мы дадамо пералік здаецца непатрэбным накладных выдаткаў. Яна таксама мае патэнцыял, каб стварыць памылкі ў кодзе?
дададзена аўтар Mick, крыніца
Гэта правільна, таму што гэта не вельмі добрая ідэя выкарыстоўваць «ўнутраны індэкс» з пералічэння, чым можа змяніцца, калі вы рэарганізоўваць код (reordening спіс). Такім чынам, вы ўпэўнены ў тым, што нумар прысвойваецца кожнаму аб'екту.
дададзена аўтар ERNESTO ARROYO RON, крыніца

Калі ідэнтыфікатар адпавядае пазіцыі ENUM элемента, вы можаце выкарыстоўваць убудаваныя ў значэння() і парадкавы() -методов.

// to enum
int intValue = 0;
CustomEnum item = CustomEnum.values()[intValue];

// to int
CustomEnum item = CustomEnum.SOME_ITEM;
int intValue = item.ordinal();
3
дададзена
Вось чаму я напісаў: «Калі ваш ідэнтыфікатар адпавядае пазіцыі ENUM элемента»
дададзена аўтар Sean Patrick Floyd, крыніца
Гэта так так так!
дададзена аўтар Ravi Thapliyal, крыніца
Гэта не вельмі добрая практыка, каб выкарыстоўваць унутраныя значэння пералічэння, можа змяніцца, калі вы змяніць парадак спісу ў зыходным кодзе.
дададзена аўтар ERNESTO ARROYO RON, крыніца

Вы можаце выкарыстоўваць EnumMap. Вы можаце паглядзець на тут для вырашэння і прыкладу.

2
дададзена

Вы таксама можаце зрабіць гэта наступным чынам:

публічнае пералік IntEnum {

Vanilla(0), Chocolate(1), Strawberry(2);

private int value;

IntEnum(int value) {
    this.value = value;
}

public int getValue() {
    return value;
}

public static IntEnum getEnum(int intValue) {
    Integer value = intValue;

    if (value == null)
        throw new IllegalArgumentException();
    for (IntEnum v : values())
        if (value.equals(v.getValue()))
            return v;
    throw new IllegalArgumentException();
}



public static void main(String[] args) {

    System.out.println(IntEnum.getEnum(1));         
}

}

1
дададзена
Калі выкарыстоўваць Int непасрэдна замест Integer , пазбегнуць магчымасці ў нулявым значэнне перадаецца ў ваш метад.
дададзена аўтар Jonathan Drapeau, крыніца
Дзякуй за ўказанне на гэта. Я рэдагаваў арыгінальны адказ
дададзена аўтар Mick, крыніца
public enum Flavor {
    Vanilla, Chocolate, Strawberry
}

Flavor v = Flavor.values()[0];

String name = v.name();//"Vanilla"

http://docs.oracle.com /javase/6/docs/api/java/lang/Enum.html#name()

0
дададзена
ха-ха, я быў занадта павольным
дададзена аўтар Tom Fobear, крыніца
@FDinoff што вы маеце на ўвазе пад гэтым?
дададзена аўтар Sean Patrick Floyd, крыніца
ах, зараз я гэта бачу
дададзена аўтар Sean Patrick Floyd, крыніца
і цяпер я не :-)
дададзена аўтар Sean Patrick Floyd, крыніца
Гэта не так, як пералічэння працаваць у Java.
дададзена аўтар FDinoff, крыніца

Выкарыстоўвайце значэнне() вынік:

enum Flavours {Vanilla, Chocolate, Strawberry}

assertTrue(Flavours.Vanilla == Flavours.values()[0]);
0
дададзена

Пералічэння дапускаюць для ўбудаваных функцый.

public enum Flavor
{
    VANILLA("Vanilla"),
    CHOCOLATE("Chocolate"),
    STRAWBERRY("Strawberry");

    private final String desc;

    Flavor(String desc)
    {
        this.desc = desc;
    }

    public String getDesc()
    {
        return desc;
    }
}
0
дададзена
Як гэта звязана з пытаннем?
дададзена аўтар Luiggi Mendoza, крыніца