我正在使用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)。
只是想知道有没有人做过类似的事情?
由于
答案 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>