10

Apache Commons CLI を使用しています。デフォルトでは、コマンド ラインのヘルプ オプションをキーのアルファベット順に並べ替えます。したがって、表示されるのは次のとおりです。

-csv
-ip
-msisdn
-xml

しかし、私は次のようにそれらを注文したい:

-csv
-xml
-ip
-msisdn

使用して HelpFormatter に渡すことができる OptionFormatter クラスがあることは知っていますが、上記の目的でそれを使用する方法の例を見ることができません (http://www.marko.homeunix.org/programming/java/ commons-cli/api/org/apache/commons/cli/HelpFormatter.OptionComparator.html)。

誰かが似たようなことをしたのだろうか?

ありがとう

4

5 に答える 5

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 で注文番号を比較します... 1 つの Options インスタンスに両方のタイプの Option インスタンスを混在させないことをお勧めします。これは、注文が複雑になる可能性があり、Comparator で有効な OrderedOption インスタンスをテストすることもできます。

于 2012-07-31T14:10:56.137 に答える