Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java args4j:in";用法“;如何手动排序选项?_Java - Fatal编程技术网

Java args4j:in";用法“;如何手动排序选项?

Java args4j:in";用法“;如何手动排序选项?,java,Java,在args4j中,我定义了如下选项: @Option(name="-host",usage="host to connect") @Option(name="-port",usage="port of the host") @Option(name="-idle",usage="idle") 但是,当显示帮助时,args4j始终按字母顺序打印 -host - host to connect -idle - idle -port - port to connect 这不方便,因为我想先显示强制

在args4j中,我定义了如下选项:

@Option(name="-host",usage="host to connect")
@Option(name="-port",usage="port of the host")
@Option(name="-idle",usage="idle")
但是,当显示帮助时,args4j始终按字母顺序打印

-host - host to connect
-idle - idle
-port - port to connect
这不方便,因为我想先显示强制选项。另外,我想自己设置选项的顺序,因为有些选项(如主机和端口)应该一起使用

如何控制args4j中选项的顺序


我发现同样的问题在3年前被问到,但没有得到回答。你不能使用当前的Args4j(至少据我所知),但由于它是开源的,我鼓励你自己实现它,并尝试在源代码中获得补丁以获得新版本

来源:
org.kohsuke.args4j.CmdLineParser

    // for display purposes, we like the arguments in argument order, but the options in    alphabetical order
     Collections.sort(options, new Comparator<OptionHandler>() {
        public int compare(OptionHandler o1, OptionHandler o2) {
            return o1.option.toString().compareTo(o2.option.toString());
        } 
    });
//出于显示目的,我们喜欢参数按参数顺序排列,但选项按字母顺序排列
Collections.sort(选项,新的Comparator(){
公共整数比较(OptionHandler o1,OptionHandler o2){
返回o1.option.toString().compareTo(o2.option.toString());
} 
});

三年后这个问题仍然没有解决。但有一个解决办法

由于
CmdLineParser
使用列表存储选项,并且该列表通过
getOptions()
公开,因此您可以获取该列表并自行排序。因为列表仅在构造函数中排序。您可以在构造
CmdLineParser
后随时对其进行排序。然后对
printUsage()
的输出进行排序


此解决方法取决于
CmdLineParser
的实现,因此它不是一个很好的仿真示例。但作为一种解决方法,它至少在当前版本(2.0.28)上有效。

您可以通过ParserProperties设置排序,然后在CmdLineParser构造函数中使用排序。如果将OptionSorter设置为null,则将保留选项顺序:

ParserProperties properties = ParserProperties.defaults();
properties.withOptionSorter(null);
CmdLineParser parser = new CmdLineParser(YOUR_OPTIONS_CLASS, properties);
因此,在问题的示例中,您将得到:

-host - host to connect
-port - port to connect
-idle - idle

目前我正忙于其他项目(甚至不是Java),但如果有人能做到这一点,那就太好了:)