Как отсканировать «аргументы» из строки и исключить пробелы? - PullRequest
0 голосов
/ 23 января 2019

Я хотел, чтобы пользователь набрал команду (например: transact fromWallet toWallet 12.00), а затем получил аргументы без пробелов из Scanner и передал их переменным для вызова определенных методов с ними. Я все еще работаю над этим, но мне удалось извлечь аргументы из inputString без методов, которые предоставляет Scanner. Scanner было слишком проблематично. Он попросил меня сделать 5 входов, где мне просто нужно 4 и так далее. Что такое «лучший путь»? Моё решение в порядке? Я закончил тем, что делал это таким образом (пожалуйста, расскажите мне о "плохой практике" в моем коде):

МЕТОДЫ ПОМОЩИ В КЛАССЕ:

public static String getNextArg(String s) {
    // get last char
    int cut = s.indexOf(" ");
    if (cut == -1)
        cut = s.length();

    // split arg
    String arg = s.substring(0, cut);

    return arg;
}

public static String getLeftOver(String s) {
    int cut = s.indexOf(" ");
    if (cut == -1)
        cut = s.length() - 1;

    s = s.substring(cut + 1);
    return s;
}

КОМАНДНАЯ ЧАСТЬ В ГЛАВНОЙ:

  String cmd = "";
    String arg1, arg2, arg3, arg4;

    System.out.println("Type your command!");
    Scanner cmdScanner = new Scanner(System.in);
    do {
        cmd = cmdScanner.nextLine();

        // Check for "exit"
        if (cmd.length() >= 4)
            if(cmd.substring(0, 4).equalsIgnoreCase("exit"))
                System.exit(0); // Is this a good way to exit a program?

        System.out.println("The args passed to cmd are: ");
        if (!cmd.trim().isEmpty()) {
            arg1 = getNextArg(cmd);
            cmd = getLeftOver(cmd);
            System.out.println("arg1 = " + arg1);
        }
        if (!cmd.trim().isEmpty()) {
            arg2 = getNextArg(cmd);
            cmd = getLeftOver(cmd);
            System.out.println("arg2 = " + arg2);
        }
        if (!cmd.trim().isEmpty()) {
            arg3 = getNextArg(cmd);
            cmd = getLeftOver(cmd);
            System.out.println("arg3 = " + arg3);
        }
        if (!cmd.trim().isEmpty()) {
            arg4 = getNextArg(cmd);
            cmd = getLeftOver(cmd);
            System.out.println("arg4 = " + arg4);
        }
        System.out.println("Type your command!");
    } while (cmdScanner.hasNext());
}

Результат соответствует моим ожиданиям. Я просто хочу знать, как я мог бы сделать это с помощью Scanner next() методов. Это может быть полезно, потому что позже я хочу получить «следующее» BigDecimal надлежащим образом, и реализация собственных методов для всего будет немного для такого нуба, как я.

1 Ответ

0 голосов
/ 23 января 2019
public static void main(String... obj) {
    try (Scanner scan = new Scanner(System.in)) {
        final Pattern whiteSpace = Pattern.compile("\\s+");
        System.out.println("Type your command!");

        do {
            String[] args = whiteSpace.split(scan.nextLine().trim());

            if (args.length == 1 && "exit".equalsIgnoreCase(args[0]))
                return;

            for (int i = 0; i < args.length; i++)
                System.out.println("arg" + (i + 1) + " = " + args[i]);

            System.out.println("Type your command!");
        } while (scan.hasNext());
    }
}
...