首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Picocli:配对参数的任意长度

Picocli:配对参数的任意长度
EN

Stack Overflow用户
提问于 2020-05-04 19:04:03
回答 1查看 91关注 0票数 1

在Picocli中,可以对任意长度的参数进行配对吗?例如:

代码语言:javascript
复制
grades Abby 4.0 Billy 3.5 Caily 3.5 Danny 4.0

如果每对必须有一个名称和一个年级,但总长度未知,即:

代码语言:javascript
复制
grades <name> <grade> [<name> <grade>]*

参数映射是最近出现的可能工作的映射。

代码语言:javascript
复制
@Parameters(index = "0..*") Map<String, float> grades;

将解析:

代码语言:javascript
复制
grades Abby=4.0 Billy=3.5 Caily=3.5 Danny=4.0

在地图上,但如果没有等价物,会更好.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-05 05:38:16

更新: picocli 4.3已经发布,并改进了对论元群中的位置参数的支持。

代码语言:javascript
复制
@Command(name = "grades", mixinStandardHelpOptions = true, version = "grades 1.0")
public class Grades implements Runnable {

    static class StudentGrade {
        @Parameters(index = "0") String name;
        @Parameters(index = "1") BigDecimal grade;
    }

    @ArgGroup(exclusive = false, multiplicity = "1..*")
    List<StudentGrade> gradeList;

    @Override
    public void run() {
        gradeList.forEach(e -> System.out.println(e.name + ": " + e.grade));
    }

    public static void main(String[] args) {
        System.exit(new CommandLine(new Grades()).execute(args));
    }
}

使用以下输入运行上述程序:

代码语言:javascript
复制
Alice 3.5 Betty 4.0 "X Æ A-12" 3.5 Zaphod 3.4

产生以下输出:

代码语言:javascript
复制
Alice: 3.5
Betty: 4.0
X Æ A-12: 3.5
Zaphod: 3.4

在picocli 4.3之前,应用程序可以完成以下操作:

代码语言:javascript
复制
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;

import java.math.BigDecimal;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@Command(name = "grades", mixinStandardHelpOptions = true, version = "grades 1.0")
public class Grades implements Runnable {

    @Parameters(arity = "2",
            description = "Each pair must have a name and a grade.",
            paramLabel = "(NAME GRADE)...", hideParamSyntax = true)
    List<String> gradeList;

    @Override
    public void run() {
        System.out.println(gradeList);
        Map<String, BigDecimal> map = new LinkedHashMap<>();
        for (int i = 0; i < gradeList.size(); i += 2) {
            map.put(gradeList.get(i), new BigDecimal(gradeList.get(i + 1)));
        }
    }

    public static void main(String[] args) {
        int exitCode = new CommandLine(new Grades()).execute(args);
        System.exit(exitCode);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61599704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档