5

I am trying to write a generic function that will accept any enum, and put the values into a map for use in a drop down.

This is what I have so far, (for a specific enum), can my function enumToMap be rewritten generally to accept any enum type?

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();
        }


    }

}

Thanks for any suggestions.

2 Answers 2

12

Change the signature of your enumToMap method to something like this:

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

Then where you call e.values() use enumType.getEnumConstants() instead.

In your main method you can then call this method like:

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

As seanizer mentions, you should also be using EnumMap as the Map implementation rather than HashMap.

Sign up to request clarification or add additional context in comments.

2 Comments

@Chris: Please accept the answer with the check if it answers your question. Thanks! =)
I did not known getEnumConstants() +1
6

Don't use a HashMap with enums, this is what an EnumMap was designed for.

As written in the Map section of the Collection Trail in the Sun Java Tutorial:

EnumMap, which is internally implemented as an array, is a high-performance Map implementation for use with enum keys. This implementation combines the richness and safety of the Map interface with a speed approaching that of an array. If you want to map an enum to a value, you should always use an EnumMap in preference to an array.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.