【问题标题】:Apache Commons CLI - ordering help options?Apache Commons CLI - 订购帮助选项?
【发布时间】:2012-07-29 07:24:55
【问题描述】:

我正在使用 Apache Commons CLI。默认情况下,它按字母顺序在命令行上按字母顺序排列帮助选项。所以,出现的是:

-csv
-ip
-msisdn
-xml

但我想按如下方式订购它们:

-csv
-xml
-ip
-msisdn

我知道您可以使用一个 OptionFormatter 类并将其传递给 HelpFormatter,但看不到任何关于如何将其用于上述目的的示例(http://www.marko.homeunix.org/programming /java/commons-cli/api/org/apache/commons/cli/HelpFormatter.OptionComparator.html)。

只是想知道有没有人做过类似的事情?

谢谢

【问题讨论】:

  • 哇。你会认为这么简单的事情会奏效。

标签: java apache-commons apache-commons-cli


【解决方案1】:

实现这种比较器的最佳 KISS 方式是:

class OptionComparator<T extends Option> implements Comparator<T> {

    private static final String OPTS_ORDER = "abcdef"; // short option names

    public int compare(T o1, T o2) {
        return OPTS_ORDER.indexOf(o1.getOpt()) - OPTS_ORDER.indexOf(o2.getOpt());
    }
}

 

【讨论】:

  • 我宁愿使用List,然后是indexOf("optName") 方法。或者更好的是,我会将添加到Options 类的相同Option 实例添加到List&lt;Option&gt;,然后在Comparator 中使用列表的indexOf(option) 方法。
【解决方案2】:

从 v1.3 开始,您可以调用 setOptionComparator(null),这样格式化程序将跳过排序,并且参数将按照添加的顺序打印。

HelpFormatter formatter = new HelpFormatter();
formatter.setOptionComparator(null);

Link 到实际问题。

【讨论】:

    【解决方案3】:

    从 Apache Commons CLI 1.2 开始,您可以直接在 HelpFormatter 类上设置比较器:

    setOptionComparator [link]

    public void setOptionComparator(Comparator comparator)

    设置用于在帮助文本中输出选项时对选项进行排序的比较器。传入null 参数会将排序设置为默认模式。

    您应该提供自己的 Comparator&lt;Option&gt; 实现,以按您希望的顺序对选项进行排序。

    【讨论】:

    • 默认是字母,所以传递 null 没有帮助。
    • @smackfu 谢谢 - 已删除。
    • 从 Apache Commons CLI 1.3 开始,他们将传递 null 比较器的结果更改为 setOptionComparator(Comparator comparator)From the documentation: 传入 null 比较器将使选项保持声明的顺序。
    【解决方案4】:

    如果您知道选项的确切顺序,您可以扩展 Option 类以包含您的订购号,并使用 Options.add(Option opt) 方法将您的 OrderedOption 实例提供给 Options 实例。

    然后,创建一个比较器并比较您的 OrderedOptions 中的订单号...我建议不要在一个 Options 实例中混合使用这两种类型的 Option 实例,因为它会使排序复杂化,并且还会在 Comparator 中测试有效的 OrderedOption 实例。

    【讨论】:

      【解决方案5】:

      目前不支持。 但它是开源的,所以你知道该怎么做......

      来自源代码:

          private static class OptionComparator
          implements Comparator {
      
          /**
           * <p>Compares its two arguments for order. Returns a negative 
           * integer, zero, or a positive integer as the first argument 
           * is less than, equal to, or greater than the second.</p>
           *
           * @param o1 The first Option to be compared.
           * @param o2 The second Option to be compared.
           *
           * @return a negative integer, zero, or a positive integer as 
           * the first argument is less than, equal to, or greater than the 
           * second.
           */
          public int compare(Object o1, Object o2)
          {
              Option opt1 = (Option)o1;
              Option opt2 = (Option)o2;
      
              return opt1.getKey().compareToIgnoreCase(opt2.getKey());
          }
      }
      

      您可以覆盖默认比较器并定义您想要的顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-18
        • 2016-08-11
        • 2015-03-05
        • 1970-01-01
        • 2011-07-31
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多