Перечисления с двумя переменными

Рейтинг: -4Ответов: 2Опубликовано: 20.08.2023

Нужно чтобы в основной программе обрабатывались римские цифры, делаю это через перечисление римских цифр. Как сделать так, что зная nummersrim я могла вывести на экран numbersar?

public enum Rim {
    I("I", 1), II("II", 2), III("III", 3), IV("IV", 4), V("V", 5), VI("VI", 6), VII("VII", 7), VIII("VIII", 8), IX("IX", 9), X("X", 10);
    private int numbersar;
    private String numbersrim;
    Rim(String numbersrim, int numbersar){
        this.numbersar = numbersar;
        this.numbersrim = numbersrim;
    }
    public String getNumbersrim(){
        return numbersrim;
    }

    public int getNumbersar(){
        return numbersar;
    }


}

Ответы

▲ 2

В данном случае достаточно вызвать метод getNumbersar для данного экземпляра Rim:

for (Rim roman : Rim.values()) {
    System.out.println(roman + ": " + roman.getNumbersar());
}

Результат:

I: 1
II: 2
III: 3
IV: 4
V: 5
VI: 6
VII: 7
VIII: 8
IX: 9
X: 10

Также можно упростить перечисление, переиспользовав стандартный метод Enum::ordinal, тогда не понадобятся отдельные поля для представления римских и арабских чисел, но потребуется ввести фиктивный "ноль":

enum Roman {
    ZERO, I, II, III, IV, V, VI, VII, VIII, IX, X;
}

// ...
System.out.println(Roman.I + ": " + Roman.I.ordinal());
// -> I: 1
 
▲ 0

Nowhere Man предложил отличную идею использовать ordinal(), позволю себе немного оптимизировать его решение:

enum Rim {
    I, II, III, IV, V, VI, VII, VIII, IX, X;

    @Override
    public String toString() {
        return ordinal() + 1 + "";
    }
}

как это работает: в каждом enum есть встроенная функция ordinal() которая возвращает порядковый номер константы, которые начинаются с 0.

I.ordinal() ///< == 0
II.ordinal() ///< == 1

поэтому нам надо добавить 1 и пустую строку чтобы сконвертировать результат в строку.

System.out.println(Rim.II); ///< "2"
System.out.println(Rim.IX); ///< "9"