Apache Commons CLI: ¿pedir opciones de ayuda?

Estoy usando la CLI de Apache Commons. Por defecto, ordena las opciones de ayuda en la línea de comandos alfabéticamente por clave. Entonces, lo que aparece es:

-csv
-ip
-msisdn
-xml

Pero quiero ordenarlos de la siguiente manera:

-csv
-xml
-ip
-msisdn

Sé que hay una clase OptionFormatter que puede usar y pasar a HelpFormatter, pero no puedo ver ningún ejemplo sobre cómo usarla para mis propósitos anteriores (http://www.marko.homeunix.org/programming/java/ commons-cli/api/org/apache/commons/cli/HelpFormatter.OptionComparator.html).

Solo me pregunto si alguien ha hecho algo similar?

Muchas Gracias

preguntado el 31 de julio de 12 a las 14:07

guau. Uno pensaría que algo así de simple funcionaría. -

6 Respuestas

Desde v1.3, puede llamar a setOptionComparator(null), de esta manera el formateador omitirá la ordenación y los argumentos se imprimirán en el mismo orden en que se agregaron.

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

Enlace al problema real.

respondido 02 nov., 16:08

A partir de Apache Commons CLI 1.2, puede configurar el comparador directamente en la clase HelpFormatter:

setOptionComparator [aquí]

public void setOptionComparator(Comparator comparator)

Configure el comparador utilizado para ordenar las opciones cuando aparecen en el texto de ayuda. pasando en un null El parámetro establecerá el orden en el modo predeterminado.

Debe proporcionar su propia implementación de Comparator<Option> que clasifica sus opciones en el orden que desee.

Respondido el 20 de junio de 20 a las 10:06

El valor predeterminado es alfabético, por lo que pasar nulo no ayuda. - scott mcintyre

@smackfu Gracias - eliminado. - Duncan Jones

A partir de Apache Commons CLI 1.3, cambiaron el resultado de aprobar un null comparador de setOptionComparator(Comparator comparator). De la documentación: Pasando en un null comparador mantendrá las opciones en el orden en que fueron declaradas. - Paraguay

Y la mejor forma de KISS para implementar dicho comparador es:

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

 

contestado el 16 de mayo de 17 a las 11:05

Prefiero usar un List y luego es indexOf("optName") método. O mejor aún, agregaría lo mismo Option instancia añadida a la Options clase a un List<Option>, y luego use la lista indexOf(option) método dentro del Comparator. - Miguel

Actualmente no es compatible. Pero es de código abierto, así que ya sabes qué hacer...

Del código fuente:

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

Puede anular el comparador predeterminado y definir el orden que desee.

Respondido 31 Jul 12, 15:07

Si conoce el orden exacto de las opciones, puede extender la clase de opción para incluir su número de orden y proporcionar sus instancias de OrderedOption a la instancia de Opciones usando el método Options.add(Option opt).

Luego, cree un comparador y compare los números de pedido en sus OrderedOptions... Recomendaría no mezclar ambos tipos de instancias de opciones en una instancia de opciones, ya que puede complicar el pedido y también probar la instancia válida de OrderedOption en Comparator.

Respondido 31 Jul 12, 15:07

Puede ordenar los valores de ayuda usando el siguiente código:

    HelpFormatter formatter = new HelpFormatter();
    // print the help options in the save order you added 
    formatter.setOptionComparator(new Comparator<Option>() {
        @Override
        public int compare(Option o1, Option o2) {
            List<Option> options = new ArrayList<Option>(getOptions().getOptions());
            Integer indexOfO1 = options.indexOf(o1);
            Integer indexOfO2 = options.indexOf(o2);
            return indexOfO1.compareTo(indexOfO2);
        }
    });
    formatter.printHelp("Commandline syntax", OPTIONS);

respondido 18 mar '22, 17:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.