Почему compareTo на Перечислимом финале в Java?

Все, что вам нужно сделать, это избавиться от первого вызова hangman():

...
for i in range(1, num_of_players + 1):
    print(players_dict['Player {}'.format(i)]
    if hangman() is False:
        results += False
    else:
        results += True

Если вам нужно сохранить возвращаемое значение, заранее назначьте его переменной:

[ 111]

Кроме того, вы можете сократить этот код, просто написав следующее (при условии, что вы не сохраните результат):

results += hangman()
87
задан Lii 26 September 2017 в 08:08
поделиться

4 ответа

Для непротиворечивости я предполагаю..., когда Вы видите enum тип, Вы знаете для факта , что его естественное упорядочивание является порядком, в котором объявляются константы.

К обходному решению это, можно легко создать собственное Comparator<MyEnum> и использовать его каждый раз, когда Вам нужно другое упорядочивание:

enum MyEnum
{
    DOG("woof"),
    CAT("meow");

    String sound;    
    MyEnum(String s) { sound = s; }
}

class MyEnumComparator implements Comparator<MyEnum>
{
    public int compare(MyEnum o1, MyEnum o2)
    {
        return -o1.compareTo(o2); // this flips the order
        return o1.sound.length() - o2.sound.length(); // this compares length
    }
}

можно использовать Comparator непосредственно:

MyEnumComparator c = new MyEnumComparator();
int order = c.compare(MyEnum.CAT, MyEnum.DOG);

или использование это в наборах или массивах:

NavigableSet<MyEnum> set = new TreeSet<MyEnum>(c);
MyEnum[] array = MyEnum.values();
Arrays.sort(array, c);    

Дополнительная информация:

Перечисления Класса
117
ответ дан Zach Scrivena 24 November 2019 в 07:48
поделиться

Перечислимые величины точно заказаны логически согласно порядку, которым они объявляются. Это - часть спецификации языка Java. Поэтому из этого следует, что перечислимые величины могут только быть сравнены, если они - члены того же Перечисления. Спецификация хочет далее гарантировать, что сопоставимый порядок, как возвращено compareTo () совпадает с порядком, в котором были объявлены значения. Это - самое определение перечисления.

6
ответ дан Martin OConnor 24 November 2019 в 07:48
поделиться

Если Вы хотите изменить естественный порядок своих enum’s элементов, изменить их порядок в исходном коде.

-1
ответ дан Bombe 24 November 2019 в 07:48
поделиться

Предоставление реализации по умолчанию compareTo, использующей порядок исходного кода, нормально; Сделать его окончательным было ошибкой со стороны Сунь. Порядковый номер уже учитывает порядок декларирования. Я согласен с тем, что в большинстве ситуаций разработчик может просто логически упорядочить свои элементы, но иногда хочется, чтобы исходный код был организован таким образом, чтобы читабельность и обслуживание были первостепенными. Например:


  //===== SI BYTES (10^n) =====//

  /** 1,000 bytes. */ KILOBYTE (false, true,  3, "kB"),
  /** 106 bytes. */   MEGABYTE (false, true,  6, "MB"),
  /** 109 bytes. */   GIGABYTE (false, true,  9, "GB"),
  /** 1012 bytes. */  TERABYTE (false, true, 12, "TB"),
  /** 1015 bytes. */  PETABYTE (false, true, 15, "PB"),
  /** 1018 bytes. */  EXABYTE  (false, true, 18, "EB"),
  /** 1021 bytes. */  ZETTABYTE(false, true, 21, "ZB"),
  /** 1024 bytes. */  YOTTABYTE(false, true, 24, "YB"),

  //===== IEC BYTES (2^n) =====//

  /** 1,024 bytes. */ KIBIBYTE(false, false, 10, "KiB"),
  /** 220 bytes. */   MEBIBYTE(false, false, 20, "MiB"),
  /** 230 bytes. */   GIBIBYTE(false, false, 30, "GiB"),
  /** 240 bytes. */   TEBIBYTE(false, false, 40, "TiB"),
  /** 250 bytes. */   PEBIBYTE(false, false, 50, "PiB"),
  /** 260 bytes. */   EXBIBYTE(false, false, 60, "EiB"),
  /** 270 bytes. */   ZEBIBYTE(false, false, 70, "ZiB"),
  /** 280 bytes. */   YOBIBYTE(false, false, 80, "YiB");

Приведенный выше порядок выглядит хорошо в исходном коде, но не является тем, как автор считает, что compareTo должен работать. Желательное поведение compareTo состоит в том, чтобы упорядочивание было по количеству байтов. Источник-Упорядочивание кода, которое могло бы это сделать, ухудшает организацию кода.

Как клиент перечисления, я не мог не заботиться о том, как автор организовал свой исходный код. Тем не менее, я хочу, чтобы их алгоритм сравнения имело какой-то смысл. Sun излишне поместила авторов исходного кода в привязку.

35
ответ дан 24 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: