首页 > 解决方案 > 区分一字、二字和三字命令

问题描述

现在,我正在使用这种方法来检查用户是否刚刚输入了带有错误参数的命令:

    private boolean relatedCommand(String input) {
        // make sure the split afterwards has at least size one
        if (input.matches(" .*")) {
            return false;
        }
        final String command = input.split(" ".toString())[0];
        return COMMAND_PACKAGE
                .keySet()
                .stream()
                .map(Pattern::toString)
                .anyMatch(patternText -> patternText.startsWith(command + " ");
    }

(COMMAND_PACKAGE 包含所有已注册的命令)

现在,这对于单字命令非常有效。例如。get <argument1> <argument2>, remove <argument1>.

但是,我目前正在从事一个同时具有单字和双字命令的项目。以下是一系列不适用于此方法的命令: add track <argument1>, add switch <argument1>, step <argument>. 在这种情况下,对于 command add track <argument1>,“track”被视为一个参数,但它实际上属于命令本身。

如果用户只输入“add”,则错误消息是“invalid arguments”。相反,错误信息应该更准确,告诉他这个命令不存在(因为只有“添加轨道”或“添加开关”)。

有谁知道如何区分一个词和两个词的命令?用户还可以使用delete rolling stock <argument>由三字命令组成的命令。

总而言之,因此有必要区分一个、两个和三个单词的命令。

标签: javasplitcommandjava-stream

解决方案


该方法String.split("\s+")将您在空格处的输入拆分为一个数组。您可以查询该数组的长度,然后您就知道您的输入包含多少个单词。

import java.util.Arrays;
import java.util.Scanner;

class Main
{
    public static void main(String[] args)
    {
        System.out.println("Enter a command");
        Scanner in=new Scanner(System.in);
        String command=in.nextLine();
        String[] parts=command.split("\\s+");
        System.out.println("parts="+Arrays.toString(parts));
        if (parts.length==0)
        {
            System.out.println("Zero parts");
        }
        else if (parts.length==1)
        {
            System.out.println("One part");
        }
        else if (parts.length==2)
        {
            System.out.println("Two parts");
        }
        else if (parts.length==3)
        {
            System.out.println("Three parts");
        }
        else
        {
            System.out.println("More than three parts");
        }
    }
}

输出:

Enter a command
a b c
parts=[a, b, c]
Three parts

进程以退出代码 0 结束


推荐阅读