2012-11-17 17 views
5

Mam tablicę ciągów zawierającą wartości wyliczenia pobrane od użytkownika. Jak teraz przekonwertować tę tablicę znaków na tablicę enum, aby elementy mogły być następnie iterowane i używane dalej w innych metodach? Trzeba to zrobić w Javie.Jak przekonwertować tablicę ciągów na tablicę enum w java

Zasadniczo pytam jest to, że na przykład jeśli mam tej tablicy

String [] names = {"Autumn", "Spring", "Autumn", "Autumn" }; 

i mam ten ENUM

enum Season 
{ 
    Autumn, Spring; 
} 

Jak mogę teraz przekonwertować powyższą tablicę typu String do tablicy enum Typ sezonu?

Odpowiedz

6

Jak to: code from here

public enum Weekdays { 
    Monday, 
    Tuesday, 
    Wednesday, 
    Thursday, 
    Friday, 
    Saturday, 
    Sunday 
} 

Jeśli trzeba zrobić odnośnika można zrobić:

Weekdays weekday = Weekdays.valueOf("Monday"); 
System.out.println(weekday); 

Ale należy zachować ostrożność, ponieważ wygeneruje IllegalArgumentException jeżeli warunkiem String nie istnieje.

+0

odniesienie odpowiedzieć na [www ] (http://viralpatel.net/blogs/convert-string-to-enum-instance-string-enum-java/). Dodanie linku do pełnego przeglądu. – bonCodigo

-1

Jeśli korzystasz z Swing, a nie z wiersza polecenia lub formularza internetowego, możesz faktycznie przekazać instancje wyliczeniowe do JComboBox. Kiedy użytkownik dokona selekcji, otrzymasz instancję Enum bezpośrednio, bez konieczności tłumaczenia między String a Enum. Ma to tę zaletę, że nie musisz się martwić zmianą nazw Enum lub błędów dużych/małych liter.

przykład:

public class Enums 
{ 
    public enum Days{ 
     MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; 

     public String toString() { 
      //return user-friendly name, or whatever else you want. 
        //for complex rendering, you need to use cell renderer for the combo box 
      return name().substring(0,1) + name().toLowerCase().substring(1, name().length()); 
     }; 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Enum test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JComboBox<Days> combo = new JComboBox<>(Days.values()); 
     combo.addItemListener(new ItemListener() { 
      @Override 
      public void itemStateChanged(ItemEvent e) { 
       if(e.getStateChange() == ItemEvent.SELECTED){ 
        Days selected = combo.getItemAt(combo.getSelectedIndex()); 
        System.out.println(selected); 
       } 
      } 
     }); 
     frame.add(combo); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

Brak typu odlewania, bez dopasowywania znaków. Super bezpieczny.

+0

@jakub ... tak, byłoby wystarczająco dobrze, jeśli możesz zamieścić przykład – pratzy

+0

@pratzy Przykład dany –

0
String s[]=new String[Numbers.values().length]; 
    int i =0; 
    for (Numbers op : Numbers.values()) { 
     s[i++] =op.toString(); 
     System.out.println(op.toString()); 
    } 


    public enum Numbers { 
    one, 
    two, 
    three 
    } 
6

Oto pełna przykładowy kod:

private static List<Season> foo(List<String> slist) { 
    List<Role> list = new ArrayList<>(); 
    for (String val : slist) { 
     list.add(Season.valueOf(val)); 
    } 
    return list; 
} 

Teraz, jeśli chcesz, aby ogólny sposób, że byłoby to zrobić dla każdego Enum, robi się trochę tricker. Trzeba użyć metody "rodzajowe":

private static <T extends Enum<T>> List<T> makeIt(Class<T> clazz, List<String> values) { 
    List<T> list = new ArrayList<>(); 
    for (String level : values) { 
     list.add(Enum.valueOf(clazz, level)); 
    } 
    return list; 
} 

Trzeba by zadzwonić to w następujący sposób:

List<Strings> slist = .... 
List<Season> elist= makeIt(Season.class, slist); 
3

odpowiedzieć na rzeczywiste pytanie:

public <T extends Enum<T>> T[] toEnums(String[] arr, Class<T> type) 
{ 
    T[] result = (T[]) Array.newInstance(type, arr.length); 
    for (int i = 0; i < arr.length; i++) 
     result[i] = Enum.valueOf(type, arr[i]); 
    return result; 
} 

Season[] seasons = toEnums(names, Season.class); 
Powiązane problemy