Distin guish между командами из одного, двух и трех слов - PullRequest
0 голосов
/ 16 февраля 2020

Сейчас я использую этот метод, чтобы проверить, вводил ли пользователь команду с неверными аргументами:

    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>. В этом случае для команды add track <argument1> «дорожка» рассматривается как аргумент, но она действительно принадлежит самой команде.

Если в поле «Добавить» используется только слово «error», появляется сообщение об ошибке «Недопустимые аргументы». Вместо этого сообщение об ошибке должно быть более точным и сообщать ему, что эта команда не существует (поскольку есть только «добавить дорожку» или «добавить переключатель»).

Кто-нибудь знает, как отличить guish между командами из одного слова и из двух слов? Пользователь также может использовать команду delete rolling stock <argument>, которая состоит из команды из трех слов.

В общем, поэтому необходимо различать команды из одного, двух и трех слов.

Ответы [ 3 ]

0 голосов
/ 16 февраля 2020

Если честно, самый простой и эффективный способ решения этой проблемы - создать список команд, в которых есть два или три слова, а затем просто выполнить сопоставление в отдельном методе, чтобы при попадании в ключевое слово, являющееся частью более длинной команды, вы проверяете следующее слово, чтобы увидеть, является ли она частью ожидаемой вами команды.

В зависимости от точной спецификации команд и т. д., вы можете использовать HashMap<String, HashMap<String, String>> для представления команды. Таким образом, вы можете просто сделать что-то вроде сохранения префикса как ключа, а затем суффикса как значения.

0 голосов
/ 16 февраля 2020

Возможно, вы захотите попробовать использовать LinkedHashMap, а затем расположить команды в порядке самых сложных (с пробелами). Таким образом, они будут сопоставлены первыми.

A LinkedHashMap сохраняет порядок, в котором вы добавляете ключи.

0 голосов
/ 16 февраля 2020

Метод 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...