Hola. Bienvenidos a esta nueva lección. Regresemos a la codificación de la clase Catálogo. Por lo pronto, cerramos este archivo y volvemos a abrir el archivo catálogo.java. Lo tenemos aquí ya cargado y volvemos adonde nos quedamos. Hicimos ya la codificación del constructor que tiene dos iteraciones, y habíamos ya construido los métodos que tenemos aquí, ya calculamos el tamaño de numDiscos y construimos el catálogo. Procedemos ahora a copiar los discos que vienen en nuevos al catálogo que tenemos acá. Lo vamos a hacer usando un "for". Vamos a poner un comentario, copias ahora los discos nuevos al catálogo en los primeros lugares del catálogo. Cerramos el comentario. Entonces, tenemos un "for", podemos declarar una variable local al "for" que sea la "i", es la que más nos gusta para recorrer arreglos, esa es la inicialización, la condición es que se va a ejecutar esto, mientras "i" sea estrictamente menor que "numNvos". ¿Por qué estrictamente menor? Porque cuando tengo un arreglo que tiene k lugares, los índices van de cero a K-1. Por lo tanto, si el tamaño del arreglo nuevos es "numNuevos", los índices van de cero, como pusimos aquí a "numNuevos -1". Por eso lo mantenemos "menor que". Y lo que vamos a hacer en cada actualización es incrementar la "i", pero también podemos incrementar de una vez el número de discos que tiene el catálogo. Eso lo va a hacer después de colocar uno de los discos. Entonces, empezamos el bloque, lo cerramos de una vez y vamos a escribir a partir de acá. "NumDiscos" nos indica también la posición en la que vamos a registrar el siguiente disco, puesto que si tenemos cero "numdiscos", llenamos la posición cero, le agregamos uno, y tendremos un disco que está en la posición cero. Por lo tanto, en catálogo, en la posición "numdiscos", vas a colocar lo que está en el archivo "nuevos", en la posición "i". A continuación, inicializar el resto de los arreglos porque ya tenemos un disco que tiene un número de transmisiones permitidas, ya copiadas. Por lo tanto, declaramos un entero número de préstamos y lo hacemos igual al disco que tenemos en la posición "numdiscos" del arreglo. Y, como eso se trata de un disco, usamos el método "getPermitidas" de ese disco. Ese número lo vas a usar para inicializar los arreglos que dependen del número de transmisiones permitidas. Por ejemplo, el número posible de fechas es exactamente el número de transmisiones permitidas, pues nunca va a haber más fechas de transmisión que el número de transmisiones permitidas. Entonces, otra vez, en el renglón "numdiscos" de fechas, lo hacemos igual a "new" y ponemos un "GregorianCalendar", y el tamaño va a ser el número de préstamos permitido. Para el caso del histórico tenemos dos renglones. Cada uno de los renglones debe tener un número de transmisiones permitidas. Entonces, tomamos "histórico" que corresponde a "numdiscos" en el renglón cero, y a ese le ponemos otra vez "GregorianCalendar", y el número de transmisiones va a ser dos veces el de permitidas porque, a lo mejor, resulta que dan de alta y de baja continuamente este disco. Ahora, tenemos que hacer lo mismo para "histórico" en el renglón "numdiscos", y queremos el renglón uno. Entonces, también ahí podemos copiar lo que teníamos arriba y simplemente lo ponemos aquí, ya que es exactamente el mismo número de posiciones. En un disco se incrementa como parte de la actualización, por lo tanto, terminamos ya el "for", y le ponemos un comentario para saber que lo estamos terminando, y terminamos también el constructor inmediatamente después, puesto que lo único que se está haciendo en el constructor es inicializar las variables. Tenemos aquí un problema porque en la línea 135, cuando estamos sacando las permitidas de "numdiscos", podría ser que nos estén pasando una referencia nula. Como ya mencionamos, siempre debemos verificar que la referencia sea distinta de nula. Sin embargo, no podemos usar aquí nuestra expresión condicional, porque la expresión condicional me regresa un valor y aquí lo que tengo que hacer es decidir si ejecuto, o no, una serie de enunciados. Por lo tanto, requieres de un enunciado condicional. A continuación, tienes el esquema de la ejecución de un enunciado condicional. Tienes dos formas de enunciados condicionales. El primero, que es el más simple, el de la izquierda, llega al enunciado condicional. Si la expresión booleana es cierta, se ejecuta un bloque para esa expresión booleana. Y si la expresión es falsa, sigue con la ejecución a continuación del enunciado. La sintaxis de los dos enunciados condicionales es la siguiente: en la condicional simple, el bloque se va a ejecutar sólo en el caso de que la expresión booleana sea verdadera. Mientras que el segundo enunciado condicional, que tiene un bloque para cuando la expresión booleana es verdadera y otro para cuando es falsa se ejecuta únicamente uno de los dos, ya que la expresión booleana sólo puede ser falsa o verdadera. Recuerda, que un bloque puede consistir de un único enunciado o de una lista de enunciados entre llaves. Un enunciado es vacio si consiste sólo de un punto y coma. Un bloque es vacio si consiste sólo de las llaves, sin ningún enunciado entre ellas, son equivalentes cualquiera de los dos. Regresando al constructor, puedes usar un "if" dentro del "for", para preguntar si nuevos de "i" es o no nulo. Y lo que podemos decir es, la expresión booleana va entre paréntesis si "nuevos" en la posición "i" no es nulo. Entonces, abrimos la llave, ajustamos todos los renglones para que estén dentro de la llave, y cerramos la condicional. Otra vez lo marcamos para que sepamos exactamente qué está sucediendo, y lo dejamos solito en un solo renglón. Esto está un poco raro, porque resulta que el bloque del "if" es muy grande y no hay nada que se haga fuera del "if" si es que no se cumple la condición. Entonces, lo que tenemos que hacer es poner la condición un poco distinta, y tienes dos enunciados que te permiten salir del bloque del "for". Entonces, si pusiéramos la condición un poco distinta, podríamos decir que si "nuevos de i" es igual a "null", entonces lo que vamos a hacer es usar alguno de los dos enunciados que nos permita salir de la iteración. Los enunciados que nos permiten salir son, por un lado el "continue" que me regresa al encabezado del "i". O sea, ejecuta la actualización y vuelve a verificar si la condición se sigue cumpliendo. La ventaja del "continue" es que sí ejecuta la actualización. Esto provocaría un problema aquí, porque me está incrementando también "numdiscos". Entonces, vamos a tener que pasar esta actualización de "numdiscos" al final del bloque que se ejecuta, porque sólo se debe ejecutar cuando se dió de alta un disco, y si "nuevos de i" es igual a "null" no se va a ejecutar. La otra manera de salir de una iteración, es con un "break". Pero, un break se sale intempestivamente hasta afuera, y lo que nosotros queremos realmente es que, si la referencia es vacía, simplemente se vaya a la siguiente referencia. Entonces, le estamos pidiendo que continúe. Como abrimos un bloque lo cerramos aquí. Ahora, esto ya se va a ejecutar si es que esta condición es falsa. No tenemos que poner un "else" porque el "continue" me está sacando del bloque de todos modos. Entonces, vamos a realinear nuevamente nuestro código, y como ya hicimos el fin del bloque de "if", ya sólo tenemos el bloque del "for". En estos diagramas podemos ver gráficamente cómo se ejecutan "continue" y "break". "Continue" me saca del bloque a la actualización, mientras que "break" me saca del bloque a la continuación después del "for". En este tercer constructor como quieres saltar un disco, si su referencia es nula, y pasar a la siguiente vuelta del "for", pregunta si la referencia es nula, esto ya lo hicimos. El resto del constructor queda como estaba, y pasas a codificar los métodos que listas en la tarjeta de responsabilidades, empezando por aquellos métodos de consulta y actualización que son válidos en esta clase. Te veo en el siguiente vídeo, no te lo puedes perder.