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.

¿Puedo tener un iterador sin hasNext()? – Pregunta de un proyecto escolar

Tengo la tarea de programar un iterador que devuelva la siguiente letra en el abecedario:

si mi cadena es ‘a’ -> ‘b’

si es ‘ad’ -> ‘ae’

si es ‘Z’ -> ‘aa’

si es ‘az’ -> ‘aA’

si es ‘aZ’ -> ‘ba’

si es ‘ZZ’ -> ‘aaa’

y así…

Simplemente no puedo entender qué debería haber en mi función ‘hasNext()’. El profesor nos dijo que no nos evaluarán con letras en grandes cantidades, por lo que ‘<valor máximo’ no es necesario.

lo único que se me ocurre es no usar esto en absoluto, pero no sé si debería o cómo escribir que no lo estoy usando. máximo’=”” no=”” es=”” necesario.=”” lo=”” único=”” que=”” se=”” me=”” ocurre=”” es=”” no=”” usar=”” esto=”” en=”” absoluto,=”” pero=”” no=”” sé=”” si=”” debería=”” o=”” cómo=”” escribir=”” que=”” no=”” lo=”” estoy=””></valor máximo’ no es necesario.

lo único que se me ocurre es no usar esto en absoluto, pero no sé si debería o cómo escribir que no lo estoy usando.>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear un iterador que devuelva la siguiente letra del alfabeto, puedes implementar la interfaz Iterator y sobrescribir los métodos hasNext() y next(). Aquí hay una posible implementación:

    public class AlphabetIterator implements Iterator<string> {
        private String current;
    
        public AlphabetIterator(String start) {
            this.current = start;
        }
    
        @Override
        public boolean hasNext() {
            return true; // siempre es true, porque podemos generar nuevas letras infinitamente
        }
    
        @Override
        public String next() {
            String resultado = current;
            char[] caracteres = current.toCharArray();
            int i = caracteres.length - 1;
            while (i >= 0 && caracteres[i] == 'Z') {
                caracteres[i] = 'a'; // reiniciar a 'a' y llevar a cabo al caracter anterior
                i--;
            }
            if (i >= 0) {
                caracteres[i]++; // sumar uno al caracter actual
            } else {
                caracteres = new char[caracteres.length + 1]; // agregar un nuevo caracter al principio
                Arrays.fill(caracteres, 'a');
            }
            current = new String(caracteres);
            return resultado;
        }
    }
    

    La clase AlphabetIterator recibe una cadena de inicio como parámetro e inicializa el campo current con ella. El método hasNext() siempre devuelve true porque podemos generar nuevas letras infinitamente. El método next() genera la siguiente secuencia de letras copiando primero la secuencia actual como resultado, luego modificándola para crear la siguiente.

    El algoritmo de modificación funciona de la siguiente manera:

    • Convertir la secuencia actual en una lista de caracteres
    • Comenzando desde el carácter más a la derecha, reemplazar todas las apariciones de Z por a y llevar a cabo la suma al siguiente carácter a la izquierda
    • Si el carácter más a la izquierda no es Z, sumarle uno y devolver la secuencia modificada
    • De lo contrario, agregar un nuevo carácter a al principio y devolver la secuencia modificada

    Por ejemplo, si la secuencia actual es "ad", el método next() la modificará de la siguiente manera:

    • Copiar "ad" en la variable resultado
    • Convertir "ad" en ['a', 'd']
    • Reemplazar d por a y llevar a cabo la suma a a: ['a', 'e']
    • Devolver el resultado "ad" y actualizar current a "ae"

    De manera similar, si la secuencia actual es "Z", el método next() la modificará de la siguiente manera:

    • Copiar "Z" en la variable resultado
    • Convertir "Z" en ['Z']
    • Reemplazar Z por a y llevar a cabo la suma a a (que aún no existe): ['a', 'a']
    • Devolver el resultado "Z" y actualizar current a "aa"

Comments are closed.