La clase colección ArrayList(y otras similares) constituyen una herramienta de pro- gramación importante porque muchos problemas requieren trabajar con colecciones de objetos de tamaño variable. Antes de continuar con el resto del capítulo es importante que se familiarice y se sienta cómodo trabajando con las colecciones; los siguientes ejercicios pueden ayudarlo.
Ejercicio 4.32 Continúe trabajando con el proyecto club del Ejercicio 4.23. Defina un método en la clase Club con la siguiente descripción:
/** Determina el número de socios que se asociaron
* en determinado mes.
* @param mes El mes que nos interesa * @return el número de socios.
*/
public int asociadosEnMes(int mes)
Si el parámetro mes está fuera del rango válido 1-12, muestra un mensaje de error y devuelve el valor 0.
Ejercicio 4.33 Defina un método en la clase Club con la siguiente descrip- ción:
/** Elimina de la colección, todos los socios
* que se hayan asociado en un mes determinado y * los devuelve en otro objeto colección.
* @param mes El mes en que ingresó el socio * @param anio El año de ingreso del socio
* @return Los socios que se asociaron en el mes
dado */
public ArrayList<Socio> purgar(int mes, int anio)
Si el parámetro mes está fuera del rango válido 1-12, muestra un mensaje de error y devuelve un objeto colección vacío.
Nota: el método purgar es significativamente más difícil de escribir que los restantes métodos de esta clase.
Ejercicio 4.34 Abra el proyecto productos y complete la clase Adminis- tradorDeStock mediante este ejercicio y los que le siguen. La clase Admi- nistradorDeStockusa un objeto ArrayList para almacenar los Productos.
Su método agregarProducto ya agrega un producto en la colección, pero es necesario completar los siguientes métodos:recibirProducto, buscarPro- ducto, mostrarDetallesDeProductos y cantidadEnStock.
Cada producto que vende la empresa se representa mediante una instancia de la clase Producto que registra su ID, su nombre y la cantidad que hay en stock. La clase Producto declara el método aumentarCantidad para regis- trar los incrementos de los niveles de stock de dicho producto. El método ven- derUnoregistra la venta de una unidad de dicho producto y disminuye en 1 el nivel del campo cantidad. El proyecto proporciona la clase Producto que no
requiere ninguna modificación.
Comience por implementar el método mostrarDetallesDeProductos para asegurarse de que puede recorrer la colección de productos. Sólo imprima los detalles de cada Producto retornado invocando su método
toString.
Ejercicio 4.35 Implemente el método buscarProducto que busca en la colección un producto cuyo campo ID coincida con el argumento ID del método. Si encuentra un producto que coincide, lo devuelve como resultado del método; de lo contrario devuelve null.
Este método difiere de mostrarDetallesDeProductos en que no necesaria- mente hay que examinar todos los productos de la colección para encontrar una coincidencia. Por ejemplo, si el primer producto de la colección coincide con el ID del producto buscado, finaliza el recorrido y se devuelve el primer producto. Por otro lado, es posible que no haya ninguna coincidencia en la colección, en cuyo caso se examinará la colección completa y no habrá ningún producto para devolver, por lo que retornará el valor null.
Cuando busque una coincidencia necesitará invocar al método getID sobre un
Producto.
Ejercicio 4.36 Implemente el método cantidadEnStock que debe ubicar un producto en la colección que coincida con su ID y devolver como resultado, la cantidad en sotck del mismo; si no coincide con el ID de ningún producto, retorna cero. Este es un proceso relativamente simple de implementar una vez que haya completado el método buscarProducto. Por ejemplo, cantida-
4.10 Otro ejemplo: un sistema de subastas 111
dEnStock puede invocar al método buscarProducto para hacer la búsqueda y luego invocar sobre el resultado al método getCantidad.Tenga cuidado con los productos que no se encuentran, piense.
Ejercicio 4.37 Implemente el método recibirProducto usando un enfoque similar al usado en cantidadEnStock.Puede buscar en la lista de productos el producto con un ID dado y luego invocar al método aumentarCantidad.
Ejercicio 4.38 Desafíos.Implemente un método en AdministradorDeStock para mostrar los detalles de todos los productos cuyos niveles de stock están por debajo de un nivel determinado (que se pasa al método mediante un pará- metro).
Modifique el método agregarProducto de modo que impida que se agregue en la lista un nuevo producto con un ID ya existente.
Agregue un método en AdministradorDeStock que busque un producto por su nombre en lugar de por su ID:
public Producto buscarProducto(String nombre) Para implementar este método necesita saber que dos objetos String s1 y s2 pueden compararse para ver si son iguales mediante la expresión lógica:
s1.equals(s2)
Encontrará más detalles sobre este tema en el Capítulo 5.
4.11
Resumen de colección flexible
Hemos visto que clases tales como ArrayList nos permiten crear colecciones que contienen un número arbitrario de objetos. La biblioteca de Java contiene más colec- ciones similares a esta y veremos algunas otras en los próximos capítulos. Encontrará que usar estas colecciones confidencialmente es una habilidad importante para escribir programas interesantes.
Existe apenas una aplicación, que veremos a partir de ahora, que no usa colecciones de este estilo. Sin embargo, antes de investigar otras variantes de colecciones flexibles de la biblioteca estudiaremos primero las colecciones de tamaño fijo.
4.12
Colecciones de tamaño fijo
Las colecciones de tamaño flexible son muy potentes porque no necesitamos conocer anticipadamente la cantidad de elementos que se almacenarán y porque es posible variar el número de los elementos que contienen. Sin embargo, algunas aplicaciones son dife- rentes por el hecho de que conocemos anticipadamente cuántos elementos deseamos almacenar en la colección y este número permanece invariable durante la vida de la colección. En tales circunstancias, tenemos la opción de elegir usar una colección de objetos de tamaño fijo, especializada para almacenar los elementos.
Una colección de tamaño fijo se denomina array o arreglo. A pesar del hecho de que los arreglos tengan un tamaño fijo puede ser una desventaja, se obtienen por lo menos 112 Capítulo 4 Agrupar objetos
dos ventajas en compensación, con respecto a las clases de colecciones de tamaño fle- xible:
El acceso a los elementos de un arreglo es generalmente más eficiente que el acceso a los elementos de una colección de tamaño flexible.
Los arreglos son capaces de almacenar objetos o valores de tipos primitivos. Las colecciones de tamaño flexible sólo pueden almacenar objetos3.
Otra característica distintiva de los arreglos es que tienen una sintaxis especial en Java, el acceso a los arreglos utiliza una sintaxis diferente de las llamadas a los métodos habituales. La razón de esta característica es mayormente histórica: los arreglos son las estructuras de colección más antiguas en los lenguajes de programación y la sin- taxis para tratarlos se ha desarrollado durante varias décadas. Java utiliza la misma sintaxis establecida en otros lenguajes de programación para mantener las cosas sim- ples para los programadores que todavía usan arreglos, aunque no sea consistente con el resto de la sintaxis del lenguaje.
En las siguientes secciones mostraremos cómo se pueden usar los arreglos para man- tener una colección de tamaño fijo. También introducimos una nueva estructura de ciclo que, con frecuencia, se asocia fuertemente con los arreglos, el ciclo for. (Tenga en cuenta que el ciclo for es diferente del ciclo for-each.)