2016-02-03 3 views
1

У меня есть следующий класс enum:Сохранение коллекции карт значений в классе Enum для лучшего доступа

public class DataParameter { 

    public enum Types { 
     BIG(-1), SMALL(1), SMAL2(2), SMAL3(5), BIG1(-1), BIG2(1), BIG3(2), BIF4(
       5); 

     private final int id; 

     Types(int id) { 
      this.id = id; 
     } 

     public int getValue() { 
      return id; 
     } 

     public static <T> parseType(T type, int id) { 
      int intType = Integer.parseInt(String.valueOf(type)); 

      if (intType == SIZE_XL.getValue()) { 
       if (id == -1) 
        return BIG; 
       if (id == 1) 
        return BIG2; 
       if (id == 2) 
        return BIG3; 
       if (id == 5) 
        return BIG4; 
      } else if (intType == SIZE_LARGE.getValue()) { 
       if (id == 5) 
        return BIG4; 
       if (id == 2) 
        return SMALL2; 
       if (id == 5) 
        return SMALL3; 
      } else if (intType == SIZE_UKNOWN.getValue()) { 
       if (id == -1) 
        return BIG; 
       if (id == -1) 
        return BIG; 
       if (id == -1) 
        return BIG1; 
       if (id == 5) 
        return BIG4; 
      } else if (intType == SIZE_UKNOWN_2.getValue()) { 
       return SMAL3; 
      } 

      return returnDefault(intType); 
     } 
    } 

    public DataParameter(GameTypes type) { 
     mValue = type.getValue(); 
    } 
} 

Проблема, что этот код очень грязные много если заявления. Я попытался создать карту, которая будет следующая структура:

SIZE_XL ---> BIG,BIG2,BIG4 
SIZE_LARGE ---> BIG4,SMALL2 ,SMALL3 
SIZE_UKNOWN ---> BIG , BIG1 , BIG4 

и их, когда, когда я получу ключ я извлечь элемент из карты я запутаться, потому что в enum классе я получаю какое-то неизвестное проблемы.

HashMap<Integer, HashMap<Integer, Integer> myMap = new HashMap<Integer, HashMap<Integer, Integer>(); 
myMap.put(SIZE_XL.getValue(),BIG2.getValue(),BIG2) 
myMap.put(SIZE_XL.getValue(),BIG3.getValue(),BIG3) 
myMap.put(SIZE_XL.getValue(),BIG4.getValue(),BIG4) 

...

... ..

Я ценю помощь в этом вопросе

ответ

0

В коде, вы оставили из определения SIZE_XL и аналогичные константы, я предлагаю, чтобы вместо определения их как некоторой константы вы помещали их в свой собственный enum, например:

enum Size { 
    XL(2), LARGE(1), UNKNOWN(-1), UNKNOWN_2(-2); 

    private final int value; 
    Size(int val) { 
    value = val; 
    } 

    public int getValue() { 
    return value; 
    } 
} 

В вашем методе анализа вы просматриваете Types на основе двух параметров, по сути это два ключа, которые вам нужно комбинировать, чтобы получить ваше значение. Table - это структура данных, определенная в Guava с двумя ключами (строка и столбец) и одно значение. Сохранение интересующих комбинаций (как определено в вашей синтаксической функции) в ImmutableTable позволяет выполнить быстрый поиск нужного значения. Код становится:

public enum Types { 
    SMALL(1), SMALL2(2), SMALL3(3), 

    BIG(0), BIG1(1), BIG2(2), BIG3(3), BIG4(4); 

    static final ImmutableTable<Integer, Integer, Types> TABLE = 
    ImmutableTable.<Integer, Integer, Types>builder() 
     .put(Size.XL.getValue(), BIG.getValue(), BIG) 
     .put(Size.XL.getValue(), BIG2.getValue(), BIG2) 
     .put(Size.XL.getValue(), BIG4.getValue(), BIG4) 
     .put(Size.LARGE.getValue(), BIG4.getValue(), BIG4) 
     .put(Size.LARGE.getValue(), SMALL2.getValue(), SMALL2) 
     .put(Size.LARGE.getValue(), SMALL3.getValue(), SMALL3) 
     .put(Size.UNKNOWN.getValue(), BIG.getValue(), BIG) 
     .put(Size.UNKNOWN.getValue(), BIG1.getValue(), BIG1) 
     .put(Size.UNKNOWN.getValue(), BIG4.getValue(), BIG4) 
     .build(); 

    private final int id; 

    Types(int id) { 
    this.id = id; 
    } 

    public int getValue() { 
    return id; 
    } 

    public static Collection<Types> getTypesWithSize(Size size) { 
    return TABLE.row(size.getValue()).values(); 
    } 

    public static Collection<Types> getTypesWithId(Types types) { 
    return TABLE.column(types.getValue()).values(); 
    } 

    public static <T> Types parseType(T type, int id) { 
    final int intType = Integer.parseInt(String.valueOf(type)); 

    if (!TABLE.contains(intType, id)) { 
     // return some default value or throw exception 
    } 
    return TABLE.get(intType, id); 
    } 
} 

Теперь вы можете использовать этот код, как:

Types.getTypesWithSize(Size.LARGE); // returns [SMALL2, BIG4, SMALL3] 
Types.getTypesWithId(Types.SMALL3); // returns [SMALL3] 

Обратите внимание, что я должен был изменить некоторые значения для Types для того, чтобы избежать дублирования строк и столбцов комбинаций, для данной строке и столбце может быть только один экземпляр Types.

1

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

т.е. Вместо использования

HashMap<Integer, HashMap<Integer, Integer> myMap = new HashMap<Integer, HashMap<Integer, Integer>(); 
myMap.put(SIZE_XL.getValue(),BIG2.getValue(),BIG2) 

использование:

HashMap<Integer, HashMap<Integer, Integer> myMap = new HashMap<Integer,  HashMap<Integer, Integer>(); 
Map<Integer, Integer> valueMap = new HashMap<Integer, Integer>();//create a map for values 
valueMap.put(BIG2.getValue(), BIG2);//put the value and enum field in the value map 
myMap.put(SIZE_XL.getValue(), valueMap);//put the value map against the key in your map. 
Смежные вопросы