10

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

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

谢谢

4

5 回答 5

22

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

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

链接到实际问题。

于 2016-11-02T08:57:17.617 回答
9

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

setOptionComparator [链接]

public void setOptionComparator(Comparator comparator)

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

你应该提供你自己的实现Comparator<Option>,按照你想要的顺序对你的选项进行排序。

于 2012-09-16T17:45:17.667 回答
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());
    }
}

 

于 2012-09-18T09:01:53.803 回答
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());
    }
}

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

于 2012-07-31T14:03:42.563 回答
1

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

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

于 2012-07-31T14:10:56.137 回答