【问题标题】:Picocli: arbitrary length of paired parametersPicocli:任意长度的成对参数
【发布时间】:2020-05-04 19:04:03
【问题描述】:

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

grades Abby 4.0 Billy 3.5 Caily 3.5 Danny 4.0

其中每对必须有名字和等级但总长度未知,即:

grades <name> <grade> [<name> <grade>]*

参数映射是最接近的,可能会起作用,例如

@Parameters(index = "0..*") Map<String, float> grades;

会解析:

grades Abby=4.0 Billy=3.5 Caily=3.5 Danny=4.0

进入地图,但如果没有等号会更好......

【问题讨论】:

  • 现在远离我的电脑,但您可以尝试使用带有两个位置参数的重复 @ArgGroup(exclusive = false, multiplicity = "1..*")
  • 对不起,这不起作用...我会尽快发布另一个答案。
  • 感谢您的提问,picocli 现在是better 库!请参阅我的更新答案。 :-)

标签: picocli


【解决方案1】:

更新:picocli 4.3 已发布,改进了对 positional parameters in argument groups 的支持。

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

使用此输入运行上述程序:

Alice 3.5 Betty 4.0 "X Æ A-12" 3.5 Zaphod 3.4

产生以下输出:

Alice: 3.5
Betty: 4.0
X Æ A-12: 3.5
Zaphod: 3.4

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

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

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2019-08-27
    • 2012-04-27
    • 2022-11-03
    相关资源
    最近更新 更多