Supongamos que tengo métodos como este-

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

Y estoy recibiendo comentarios como este-

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

Y si la entrada es "ac", ¿cómo puedo separar la entrada y llamar a los métodos a () y c () por expresiones regulares?

0
user9133855 17 oct. 2018 a las 09:50

2 respuestas

La mejor respuesta

Puede usar una declaración switch aquí:

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;
    }
}

He realizado un cambio de diseño significativo aquí. Supongo que ingresará los nombres de los métodos separados por tubería. Por ejemplo, si quisiera llamar a a() y c(), en ese orden, ingresaría a|c en el escáner. La tubería | no está permitida en los nombres de métodos de Java que yo sepa, por lo que es un buen candidato para un separador.

Podría haber una forma de intentar invocar directamente un método utilizando el nombre de la cadena, p. Ej. utilizando la reflexión, pero luego tendríamos que preocuparnos por un método que potencialmente no existe. La declaración case anterior evita que esto suceda.

1
Tim Biegeleisen 17 oct. 2018 a las 06:59

Creo que la respuesta de Tim Biegeleisen resuelve el problema. Aquí hay una solución alternativa que podría ser de alguna utilidad.

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();
    }
}

Salida:

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

La idea es que puede poner sus funciones en un mapa a medida que las está definiendo (puede ser aún más simple si las funciones son similares). Para leer y analizar la entrada del usuario, sugiero usar el enfoque en la respuesta de Tim Biegeleisen. Aquí asumo que ya se ha hecho y me concentro en tratar de evitar tener una declaración switch.

1
jrook 17 oct. 2018 a las 10:06