Hola. Bienvenidos a esta segunda lección. La repetición en datos corresponde a una repetición en ejecución, que es lo que veremos en esta sesión. Empezaremos con los constructores de la clase "Catálogo". En la tarjeta de responsabilidades tienes escritos tres constructores. El primero no tiene parámetros y construye un catálogo con el máximo número de posiciones y todos los arreglos asociados. El segundo tiene un parámetro que es el máximo número de discos que va a tener ese catálogo, por lo que construye el catálogo y todos los arreglos asociados. El tercer constructor tiene dos parámetros, el número de discos que es el máximo de discos que va a aceptar, y un arreglo inicial de discos que es con lo que llena algunos de los estantes de esos discos. Procedes a escribir el código para cada uno de ellos, ahora que ya tienes la construcción y el uso de arreglos. El constructor sin parámetros aparece así en la tarjeta de responsabilidades. Regresa a un catálogo y construye un catálogo con el máximo número de posiciones. Como los arreglos asociados al catálogo tienen sólo referencias nulas, no sabes cuántas localidades construir en lo que corresponde a los discos. El encabezado con el comentario de Javadoc será así, construye un catálogo, da el máximo número posible de registros para discos y anota que no tiene todavía ningún disco registrado. Se construirán los arreglos correspondientes a histórico y fechas pero, únicamente, con su número de renglones o tablas dependiendo de cuántas dimensiones tenga. Al registrar cada disco, se construirán los arreglos correspondientes a sus fechas y su histórico. El encabezado es muy sencillo, es público, tiene el nombre de la clase y no tiene ningún parámetro. Tenemos que construir un catálogo de una dimensión, por lo tanto, asignamos en el catálogo un arreglo de disco que tiene como tamaño la constante de clase que declaramos llamada "MAX_DISCOS", esto porque no tenemos información adicional del número de discos que quiere tener en el catálogo. El segundo atributo que tenemos que inicializar aquí es avisar que el número de discos es todavía cero. Esto es porque no llevamos ningún disco registrado. Puedes construir el número de renglones, el mismo que en el catálogo, pero cada renglón tiene un número de columnas que corresponde al número de transmisiones permitidas para el disco en esa posición. Como no hay disco, no podemos definir el número de columnas. Vamos a hacer un comentario sobre cómo funciona el catálogo de discos. El número de posiciones disponibles para registrar transmisiones activas en el arreglo "fechas" estará dado por el número de transmisiones permitidas del disco en esa posición, que no se sabrá hasta que se construya ese disco. El número de posiciones ocupadas estará dado por el número de transmisiones activas del disco en esa posición. Procedemos a construirlo, y lo que tenemos es que "fechas" es un arreglo de dos dimensiones. Lo construimos con un arreglo de "Gregorian Calendar" que en la primera posición tendrá el mismo tamaño que el catálogo, que está dado por el atributo "length". En la segunda posición no sabemos todavía cuántos elementos va a tener en cada uno de los renglones. Recuerda que en Java podemos tener cada renglón de tamaño distinto. El arreglo histórico, lo construyes de manera similar a "fechas" ya que el número de columnas dependerá del número de transmisiones permitidas en el disco. Sabemos que para cada disco necesitamos dos elementos, el de inicio y final de cada transmisión. Lo que no sabemos es cuántas parejas para estos elementos vamos a tener. Por lo tanto, la construcción se da como sigue. Histórico, construimos un objeto nuevo de la clase "Gregorian Calendar", es de tres dimensiones. En la primera dimensión tiene el mismo tamaño que el catálogo. En la segunda dimensión sabemos que queremos parejas, por lo tanto, le damos dos elementos, y lo que no sabemos es cuántas de estas parejas vamos a tener, y queda así. Por último, tienes el arreglo "numHist" que dice para cada disco cuál es el número posible de registros históricos que tiene registrado el disco en cada posición. Como el catálogo todavía no tiene ningún disco, simplemente construyes el número de elementos necesarios. Como ya tenemos declarado el atributo, le vamos a asignar un arreglo nuevo de enteros de una dimensión y tendrá el tamaño de catálogo de discos. Le pondremos un comentario. Como son objetos, los elementos numéricos se inician siempre en cero, y con eso termina la construcción de este catálogo. Para el siguiente constructor, sabemos que tiene un parámetro que es el tamaño del arreglo. Vamos a poner su comentario. Construye un catálogo con espacio para un número definido de disco, que es el número que se le está pasando como argumento. Los espacios para discos contienen una referencia nula porque no ha sido construido ningún disco. Se construirán los arreglos correspondientes a histórico y fechas, pero únicamente con su número de renglones o tablas. Al registrar a cada disco, se completarán los arreglos correspondientes a sus fechas e histórico. Este constructor recibe como parámetro "numDiscos" que es el máximo número de discos que puede tener este catálogo y regresa un objeto de su clase. El encabezado lo tenemos dado por la tarjeta de responsabilidades, se trata de un método público. Es un constructor, por lo que tiene el nombre de la clase. Recibe como parámetros un entero llamado "numDscs". Nota que "numDscs", el identificador del parámetro aunque suene igual cuando lo leemos es distinto a "numDiscos", el identificador del atributo que tenemos para este catálogo. Colocamos el comentario, verificas que el argumento esté dentro de rangos. Por lo tanto, declaras un entero dentro del método constructor que se llama "maxDiscos" y vas a usar al método "checaEntero" que hicimos público en la clase Disco. Por lo que lo podemos preceder con la clase Disco, le das el mínimo que debemos tener que es uno, el número de discos que nos están pasando en el parámetro, pero no puede ser mayor que "maxDiscos" que es el tamaño máximo que puede tener cualquier arreglo de este disco. Una vez definido el tamaño, que va a estar entre uno y "maxDiscos", construimos el catálogo con ese tamaño. El atributo catálogo es igual a "new" del tipo de objeto que va a guardar, que es Disco. Es de una dimensión y va a tener "maxDiscos" que es el valor que acabamos de obtener. Esta es la construcción del catálogo con ese tamaño. Este constructor tampoco nos pasa ningún disco que registrar. Por lo tanto "numDscs" será igual a cero. Copias del primer constructor lo que hiciste para las transmisiones y lo pegas. Será igual porque va a registrar el tamaño del catálogo, y con esto terminamos el constructor sin parámetros. Vamos a agregarle a nuestro código que está encerrando las llaves. Entonces, el primer constructor en esta llave termina el constructor sin parámetros. Y en esta llave termina el constructor con el tamaño del catálogo. Veremos después que esto nos ayuda a aclarar qué llaves están cerradas. Ahora veremos el tercer constructor, y en la tarjeta de responsabilidades nos dice que recibe como entradas el número de discos y un arreglo inicial de discos. Lo que procede a hacer es construir un catálogo con tantas posiciones como lo indica el parámetro, y registra tantos discos como le indique el arreglo "nuevos". El comentario Javadoc queda como sigue. Construye un catálogo con espacio para un número definido de discos. El catálogo lo inicializas con el contenido del arreglo que recibes como parámetro. Inicializas el contador de discos activo relativo al número de discos en el parámetro. Para aquellos discos que ya están construidos, construyes las columnas del arreglo "fechas" y del arreglo "histórico". Si el número de lugares solicitados es menor que el tamaño del arreglo que recibes como parámetro, para la inicialización vas a utilizar este último tamaño para los arreglos que corren paralelos. Este constructor recibe un parámetro que se llama "numDscs", que es el máximo número de posiciones. Recibe un segundo parámetro que es el arreglo inicial de discos para el catálogo. En el encabezado tenemos que el método es público, es un constructor de la misma clase por lo que recibe el nombre de "catálogo". Tiene como parámetros un entero llamado "numDscs" y un arreglo de discos llamado "nuevos". Lo primero que tenemos que verificar es cuál es mayor, si el valor de "numDscs" o el tamaño de "nuevos". Entonces, vamos a definir el tamaño de nuevos. Colocamos nuestra expresión en condicional. Verificamos que no vaya a ser que "nuevos" sea una referencia nula. Si esto fuera así, entonces, al tratar de sacar el tamaño, abortaría el programa con un mensaje de error. Entonces, preguntamos si es cierto que "nuevos" sea "null", en cuyo caso el tamaño de "nuevos" es cero. Y si no es cierto, podemos utilizar a "nuevos" y pedirle su atributo "length". Hay que decidir el tamaño final del catálogo. Primero, verificamos cuál es mayor entre el número dado, como tamaño, y el tamaño del arreglo inicial. Utilizaremos la misma variable que nos están pasando como parámetro, y si "numDscs" es menor que "numNvos", entonces vamos a asignar "numNvos" como valor de "numDscs", y sino dejamos "numDscs". Ahora queremos saber si "numDscs" está dentro del rango. Nuevamente le pedimos al método "checaEntero" de la clase Discos, le damos como límite inferior, uno, como valor que le estamos pasando, "numDscs", y como valor máximo, "MAX_DISCOS". Lo que va a quedar en "numDscs" es un valor válido en todos los sentidos. Si los discos nuevos son más que el tamaño de "MAX_DISCOS", sólo copiaremos hasta "MAX_DISCOS", colocamos un comentario. El número de discos a copiar es el mínimo entre el tamaño final del arreglo y el número de discos nuevos. Por lo tanto, modificamos también "numNvos", le asignamos el valor si "numNvos" es mayor que "numDscs". Entonces, el valor que va a tener es "numDscs", y si esto es falso se queda con el valor que tenía. Ahora sí, ya podemos empezar a construir los arreglos. El catálogo es igual a "new" de objetos Disco, arreglo de una dimensión cuyo tamaño es "numDscs". "NumDscs" lo vamos a ir modificando conforme vamos copiando los discos. Por lo tanto, lo ponemos en cero, aunque por tratarse de un atributo numérico está en cero desde que lo declaramos. Después, vamos a dar de alta los renglones para cada disco. Entonces, tenemos "Gregorian Calendar" y nuevamente le damos el tamaño de la primera dimensión, que es "catálogo.length", y el de la segunda dimensión lo iremos dando conforme vayamos copiando los discos. Por último, "histórico" es un arreglo de fechas de la clase "Gregorian Calendar", su primera dimensión va paralela al arreglo de discos y su segunda dimensión tiene dos elementos, uno para la fecha de inicio y otro para la fecha final. ¿Cuántas de estas parejas vamos a tener? Aún no lo sabemos hasta que sea el disco correspondiente. "NumHist" es también un arreglo donde, para cada disco, me dice cuántos elementos hay dados de alta y baja. Es un arreglo de enteros que tiene de tamaño el de "catalogo.length". Lo que tienes que hacer ahora es copiar cada uno de los discos que vienen en "nuevos" al catálogo. Como a la hora de codificar no sabes cuántos discos nuevos hay en el arreglo "nuevos", no puedes simplemente poner enunciados del tipo de "catalogo" de cero igual a "nuevos" de cero, "catalogo" de uno igual a "nuevos" de uno, porque ni siquiera sabes si "nuevos" es una referencia nula o si tiene uno o más discos. Por lo tanto, vas a tener que hacer una repetición en ejecución. Viste ya cómo usar a cada uno de los elementos de un arreglo. Toda repetición que, en adelante, se llamará "iteración" tiene que tener lo siguiente. Inicialización, que es el valor o valores iniciales antes de entrar a la iteración. Tiene que tener una expresión "booleana". Si se evalúa a verdadero indica una nueva ejecución de la iteración. Si se evalúa a falso, sale de la iteración y continúa con la ejecución fuera de ella. Tiene un bloque que es un enunciado o conjunto de enunciados entre llaves, que indica lo que se va a hacer en cada vuelta o iteración. Al final del bloque deberá haber una actualización, que es la modificación de los valores que controlan la iteración para conseguir, en algún momento, que la expresión "booleana" se evalúe a falso y no siga ejecutándose para siempre. La inicialización sólo se ejecuta una vez antes de entrar a la iteración. Este es el flujo que tiene una iteración, empieza por la inicialización que se ejecuta, después pasa a evaluar la expresión "booleana", si es verdadera ejecuta el bloque y si es falsa continúa después de la iteración. Y, por último, después de ejecutar el bloque se ejecuta la actualización. Algunas veces se piensa que se ejecuta la actualización la segunda vez que se trata de entrar al bloque. Por último, se regresa a evaluar la expresión "booleana", y así hasta que la expresión sea falsa. La iteración que usarás más frecuentemente, sobre todo para recorrer arreglos, es la que se conoce como "for" y su sintaxis es, está el "for", luego entre paréntesis está la inicialización, que es una expresión de asignación generalmente, terminamos con un punto y coma, después viene una expresión "booleana" con un punto y coma y, por último, una actualización. Se cierran los paréntesis y viene el bloque, que puede consistir de uno o más enunciados. Puedes ver que en su sintaxis están todos los componentes de una iteración que mencionamos antes. Guardemos nuestro archivo que tenemos, se llamará "catálogo" porque el encabezado dice clase Catálogo, y en el subdirectorio, "Discos". Nos vemos en el siguiente video. Te espero.