Элегантный способ сопоставить int с перечислением, где каждый тип перечисления соответствует диапазону - PullRequest
2 голосов
/ 26 января 2010

Я пытаюсь придумать элегантный способ решения этой проблемы в Java:

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

Например

enum grades{

    A -> 90-95%
    B -> 85-90%,
    C -> 75-85%
    ...
    etc

}

Кто-нибудь может придумать краткий способ написать метод, который с помощью int возвращает перечисление классов или генерирует исключение IllegalArgumentException?

Ответы [ 3 ]

4 голосов
/ 26 января 2010

Напишите статический метод, точно так же, как valueOf() уже существует, назовите его, скажем inRange(), верните Grade.

public enum Grade {
    A(100, 90), B(89, 80), C(79, 70);

    int uBound;
    int lBound;

    Grade(int uBound, int lBound){
      ...
    }

    public static Grade inRange(int percent){
      ...
    }
}

Лучше инициализировать статический map, проценты в качестве ключей и оценку в качестве значений. В этом случае я предлагаю вам использовать коллекцию Apache Commons MapUtils. Ниже приведен пример

private static final Map<Integer, Grade> GRADE_MAP = UnmodifiableMap.decorate(
        MapUtils.putAll(new HashMap<Integer, Grade>(), new Object[][]{
            {0, F}, {1, F}, .....,
            .....
            .....
            {100, A}
        }));

тогда ваш метод будет выглядеть ниже,

    public static Grade inRange(int percent){
      return GRADE_MAP.get(percent);
    }
1 голос
/ 26 января 2010

Заранее создайте массив с индексом 0..100 и присвойте каждому слоту значение, которому вы хотите, чтобы оно соответствовало.

Тогда в реальном цикле просто посмотрите значение в массиве.

1 голос
/ 26 января 2010

Я бы сделал границы атрибутом перечисления и реализовал бы метод

public boolean isInRange(int i)

в перечислении, используя границу и границу перечисления со следующим нижним порядковым номером.

Наконец, реализуем статический метод для перечисления, который перебирает экземпляры, чтобы найти соответствующий экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...