2010-09-22 68 views
5

我想寫一個通用函數,它將接受任何枚舉,並將這些值放入地圖中,以便在下拉列表中使用。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 2010-09-22 15:55:49

+0

@Chris:請接受與檢查的答案是否回答你的問題。謝謝! =) – ColinD 2010-09-22 15:59:58

+0

我不知道getEnumConstants()+1 – Wooff 2015-06-11 07:14:32

6

不要使用帶枚舉的HashMap,這是EnumMap的設計目的。

由於在Sun Java教程寫在Map section of the Collection Trail

EnumMap,在內部 作爲數組實現的,是與枚舉鍵使用 高性能Map實施 。這個 實現將豐富性 和Map接口的安全性與接近數組的接口速度相結合。如果 要將枚舉映射到值 ,則應始終使用EnumMap優先於 的數組。