假设我有这样的方法-
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()方法?
答案 0 :(得分:1)
您可以在此处使用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
语句避免了这种情况的发生。
答案 1 :(得分:1)
我认为Tim Biegeleisen的答案解决了这个问题。这是一种可能有用的替代解决方案。
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!
这个想法是,您可以在定义函数时将它们放在地图中(如果函数相似,它甚至会更简单)。为了阅读和分析用户输入,我建议使用Tim Biegeleisen的答案中的方法。在这里,我假设已经完成了操作,并着重于尝试避免使用switch
语句。