Как сделать регулярное выражение, которое сопоставляет ввод символов с методами и вызывает его? - PullRequest
0 голосов
/ 17 октября 2018

Предположим, у меня есть такие методы:

void a(){
//Some statements here
}
void b(){
//Some statements here
}
void c(){
//some statements here
}

И я принимаю входные данные вот так:

Scanner sc = new Scanner(System.in);
String name = sc.next();

А если вход "ac", то как я могу отделитьвводить и вызывать методы a () и c () через regex?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Я думаю, что ответ Тима Бигелейзена решает проблему.Вот альтернативное решение, которое может быть полезным:

import java.util.HashMap;
import java.util.Map;

public class FunctionMap {


    public static void main(String[] args) {
        Map<Character, java.lang.Runnable> methodMap = new HashMap<>();

        //If methods are similar, define them all in one fell swoop
        for(char i ='a'; i<='y'; i++) {
            final char finalI = i;
            methodMap.put(i,
                    () -> System.out.println("Boring method " + finalI + " invoked"));
        }

        //If they are not similar, define them separately.
        methodMap.put('z',
                () -> System.out.println("This method is very different!"));

        String userInput = "abvdxz";
        for(char s: userInput.toCharArray())
            methodMap.get(s).run();
    }
}

Вывод:

Method a invoked
Method b invoked
Method v invoked
Method d invoked
Method x invoked
This method is very different!

Идея состоит в том, что вы можете поместить свои функции в карту так, как вы их определяете (этоможет быть даже проще, если функции похожи).Для чтения и анализа пользовательского ввода я предлагаю использовать подход в ответе Тима Бигелайзена.Здесь я предполагаю, что это уже сделано, и сосредотачиваюсь на попытке избежать выражения switch.

0 голосов
/ 17 октября 2018

Вы можете использовать оператор switch здесь:

Scanner sc = new Scanner(System.in);
String name = sc.next();
String[] methods = name.split("\\|");

for (String method : methods) {
    switch(method) {
        case "a":
            a();
            break;

        case "c":
            c();
            break;

        default:
            System.out.println("No method " + method + "() is known to exist");
            break;
    }
}

Я внес одно существенное изменение в конструкцию здесь.Я предполагаю, что вы будете вводить имена методов как разделенные конвейером.Например, если вы хотите позвонить a() и c(), в этом порядке вы должны ввести a|c в сканер.Насколько я знаю, в именах методов Java не допускается использование конвейера |, поэтому он является хорошим кандидатом для разделителя.

Возможно, существует способ попытаться напрямую вызвать метод, используя имя строки,например, используя отражение, но тогда нам придется беспокоиться о методе, который потенциально не существует.Вышеупомянутое выражение case позволяет избежать этого.

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