2010-09-22 3 views
5

Я пытаюсь написать общую функцию, которая примет любое перечисление, и поместите значения в карту для использования в раскрывающемся списке.Общий параметр enum в java. Это возможно?

Это то, что у меня есть до сих пор (для конкретного перечисления), может ли моя функция enumToMap быть перезаписана вообще, чтобы принять любой тип перечисления?

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class Main { 

    private enum testenum{ 
     RED,BLUE,GREEN 
    } 


    private static Map enumToMap(testenum e){ 
     HashMap result = new HashMap(); 
     List<testenum> orderReceiptKeys = Arrays.asList(e.values()); 
     List<String> orderReceiptValues = unCapsCase(orderReceiptKeys); 
     for(int i=0;i<orderReceiptKeys.size();i++){ 
      result.put(orderReceiptKeys.get(i), orderReceiptValues.get(i)); 
     } 
     return result; 
    } 

    /** 
    * Converts a string in the form of 'TEST_CASE' to 'Test case' 
    * @param s 
    * @return 
    */ 
    private static String unCapsCase(String s){ 
     StringBuilder builder = new StringBuilder(); 
     boolean first=true; 
     for(char c:s.toCharArray()){ 
      if(!first) 
       c=Character.toLowerCase(c); 
      if(c=='_') 
       c=' '; 
      builder.append(c); 
      first=false; 
     } 
     return builder.toString(); 
    } 


    /** 
    * Converts a list of strings in the form of 'TEST_CASE' to 'Test case' 
    * @param l 
    * @return 
    */ 
    private static List<String> unCapsCase(List l){ 
     List<String> list = new ArrayList(); 

     for(Object o:l){ 
      list.add(unCapsCase(o.toString())); 
     } 

     return list; 
    } 


    public static void main(String[] args) throws Exception { 

     try{ 
      testenum e=testenum.BLUE; 
      Map map = enumToMap(e); 
      for(Object k:map.keySet()){ 
       System.out.println(k.toString()+"=>"+map.get(k)); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 


    } 

} 

Спасибо за любые предложения.

ответ

12

Изменение подписи вашего метода enumToMap к чему-то вроде этого:

private static <E extends Enum<E>> Map<E, String> enumToMap(Class<E> enumType) 

Тогда где вы называете e.values() использовать enumType.getEnumConstants() вместо этого.

В вашем основном методе вы можете вызвать этот метод, как:

Map<testenum, String> map = enumToMap(testenum.class); 

Как отмечает seanizer, вы также должны использовать EnumMap как Map реализации, а не HashMap.

+0

Отлично! Огромное спасибо. – Chris

+0

@Chris: Пожалуйста, примите ответ с проверкой, отвечает ли он на ваш вопрос. Благодаря! =) – ColinD

+0

Я не знал getEnumConstants() +1 – Wooff

6

Не используйте HashMap с перечислениями, это то, для чего был создан EnumMap.

Как написано в Map section of the Collection Trail в Sun Java Tutorial:

EnumMap, который внутренне реализован в виде массива, является высокоэффективной Map реализацией для использования с ключами перечислений. Эта реализация сочетает в себе богатство и безопасность интерфейса Map с частотой , приближающейся к скорости массива. Если вы хотите сопоставить перечисление со значением, , вы всегда должны использовать EnumMap в предпочтение к массиву.

Смежные вопросы