Apache Commons CLI - 订购帮助选项?

时间:2012-07-31 13:47:17

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

我正在使用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)。

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

由于

5 个答案:

答案 0 :(得分:14)

从v1.3开始,你可以调用setOptionComparator(null),这样格式化程序就会跳过排序,并且参数的打印顺序与它们的添加顺序相同。

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

Link实际问题。

答案 1 :(得分:8)

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

  

setOptionComparator [link]

     

public void setOptionComparator(Comparator comparator)

     

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

您应该提供自己的Comparator<Option>实施方案,按您希望的顺序对您的选项进行排序。

答案 2 :(得分:8)

实施这种比较器的最佳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());
    }
}

答案 3 :(得分:3)

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

来自源代码:

    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());
    }
}

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

答案 4 :(得分:1)

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

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