es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Instanciando de forma dinámica una cadena de objetos enlazados.

Estoy implementando un patrón de cadena de comando para una búsqueda de subcadenas. Puedo crear la cadena estáticamente escribiendo algo como esto:

matchChain = new CharMatcher(new DotMatcher(new CharMatcher(null)));

donde declaro explícitamente qué cada carácter en la cadena va a ser para que coincida con el patrón Carácter Punto Carácter ("c.c").

Pero mi objetivo es crear dinámicamente esta cadena para cualquier patrón de clave dado. Por ejemplo, ("``cccc.cc``*c") sería:

matchChain = new CharMatcher(new CharMatcher(new CharMatcher(new CharMatcher(new CharMatcher(new DotMatcher(new CharMatcher(new CharMatcher(new StarMatcher(new CharMatcher(null)))))))));

Entonces, la clase Chain es una clase abstracta y cada una de las clases matcher extiende Chain.

Entonces, ¿cómo puedo instanciar dinámicamente una cadena en función de la longitud de la clave/patrón dado?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de instanciar dinámicamente una cadena basada en la longitud de la clave/patrón dada es utilizar un bucle para crear y encadenar el número apropiado de objetos de coincidencia.

    Aquí hay un ejemplo de implementación:

    public Chain createMatcherChain(String pattern) {
        Chain matcherChain = null;
        Chain currentMatcher = null;
        int patternLength = pattern.length();
    
        for (int i = patternLength - 1; i >= 0; i--) {
            char currentChar = pattern.charAt(i);
            Chain newMatcher = null;
    
            if (currentChar == '.') {
                newMatcher = new DotMatcher(currentMatcher);
            } else if (currentChar == '*') {
                newMatcher = new StarMatcher(currentMatcher);
            } else {
                newMatcher = new CharMatcher(currentChar, currentMatcher);
            }
    
            currentMatcher = newMatcher;
    
            if (i == 0) {
                matcherChain = newMatcher;
            }
        }
    
        return matcherChain;
    }
    

    Este método recibe un patrón de cadena, recorre cada carácter en orden inverso y crea y encadena los objetos de coincidencia apropiados en función del carácter actual.

    Si el carácter actual es un punto (‘.’), se crea un nuevo objeto DotMatcher y se encadena al objeto anterior. Si el carácter actual es un asterisco (‘*’), se crea un nuevo objeto StarMatcher y se encadena al objeto anterior. De lo contrario, se crea un nuevo objeto CharMatcher con el carácter actual y se encadena al objeto anterior.

    La variable currentMatcher realiza un seguimiento del objeto de coincidencia anterior en la cadena, y la variable matcherChain se establece en el primer objeto de coincidencia creado (que también es el último en la cadena).

    Una vez que se completa el bucle, el método devuelve el objeto matcherChain, que representa toda la cadena de objetos de coincidencia para el patrón dado.

Comments are closed.