Свободное-городское-население-cli Java, опции со списком возможных значений

итеративный алгоритм для Fibonacci, потому что для меня это закрепило то, что самый изящный код (в этом случае, рекурсивная версия) является не обязательно самым эффективным.

повторяющийся метод, (воркуют = prev1 + prev2 в forloop) не делает дерева этот путь, и при этом это не берет в качестве большой памяти, так как это - только 3 переходных переменные вместо кадров n в стопке рекурсии.

Вы знаете, что fibonacci имеет закрытое решение для формы, которое позволяет прямое вычисление результата в постоянном числе шагов, правильно? А именно, (phi <глоток> n - (1 - phi) <глоток> n ) / sqrt (5). Это всегда кажется мне несколько замечательный, что это должно привести к целому числу, но это делает.

phi является золотым сечением, конечно; (1 + sqrt (5)) / 2.

12
задан Emmanuel Bourg 29 May 2012 в 12:16
поделиться

3 ответа

Поскольку commons-cli не поддерживает это напрямую, самым простым решением, вероятно, является проверка значения опции, когда вы ее получите.

6
ответ дан 2 December 2019 в 18:19
поделиться

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

private void checkSuitableValue(CommandLine line) {
    if(line.hasOption("a")) {
        String value = line.getOptionValue("a");
        if("foo".equals(value)) {
            println("OK");
        } else if("bar".equals(value)) {
            println("OK");
        } else {
            println(value + "is not a valid value for -a");
            System.exit(1);
        }
     }
 }

Очевидно, что были бы более удобные способы сделать это, чем длинный if / else, возможно, с перечислением , но это должно быть все вам понадобится. Также я не скомпилировал это, но я считаю, что это должно работать.

Этот пример также не делает переключатель «-a» обязательным, поскольку он не был указан в вопросе.

6
ответ дан 2 December 2019 в 18:19
поделиться

Другой способ - расширить класс Option. В процессе работы мы сделали следующее:

    public static class ChoiceOption extends Option {
        private final String[] choices;

        public ChoiceOption(
            final String opt,
            final String longOpt,
            final boolean hasArg,
            final String description,
            final String... choices) throws IllegalArgumentException {
        super(opt, longOpt, hasArg, description + ' ' + Arrays.toString(choices));
        this.choices = choices;
       }

      public String getChoiceValue() throws RuntimeException {
        final String value = super.getValue();
        if (value == null) {
            return value;
        }
        if (ArrayUtils.contains(choices, value)) {
            return value;
        }
        throw new RuntimeException( value " + describe(this) + " should be one of " + Arrays.toString(choices));
     }

      @Override
      public boolean equals(final Object o) {
        if (this == o) {
            return true;
        } else if (o == null || getClass() != o.getClass()) {
            return false;
        }
        return new EqualsBuilder().appendSuper(super.equals(o))
                .append(choices, ((ChoiceOption) o).choices)
                .isEquals();
     }

      @Override
      public int hashCode() {
        return new ashCodeBuilder().appendSuper(super.hashCode()).append(choices).toHashCode();
      }
  }
8
ответ дан 2 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

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