Hola.
Lo primero, necesitamos una clase
Producto. Algo sencillo: constructor,
getters (setters no harán falta) y un método toString()
Lo siguiente, una clase
Carrito.
Esta clase tendrá un ArrayList de objetos
Producto y será ella quien se encargue de ordenar los productos y filtrar según una categoría indicada por el usuario.
Para ordenar los productos, podemos usar objetos de la clase
Comparator.
Mediante estos objetos, podemos decirle a un ArrayList cómo deseamos que ordene los objetos que contiene.
Como hay tres atributos distintos por los que podemos ordenar: nombre, categoria y precio pues escribiremos tres clases
Comparator y en cada una ordenaremos por un atributo o por otro.
Por ejemplo, para ordenar "por nombre", escribiríamos esta clase
Comparator en la que indicamos que el orden ha de ser el resultado de comparar el atributo nombre:
De esta manera, si simplemente queremos listar el carrito, sin ningún orden específico, lo haríamos así:
Y si queremos que se muestren ordenados. Tenemos dos posibilidades.
Una, ordenar el ArrayList original y listarlo en pantalla:
Dos, si no queremos modificar el orden del ArrayList original, podemos crear un
stream a partir de él. Y será este
stream el que ordenaremos y listaremos en pantalla:
En cuanto al "filtrado".
Podríamos simplemente recorrer el ArrayList y mostrar solo los objetos que coincidan con la categoría:
Con esto sería suficiente, ya que es un filtrado sencillo.
Si el filtrado fuera más complejo (hubiera que tener en cuenta varios atributos), entonces vamos a preferir formas más avanzadas y para ello en Java tenemos los "predicados" (interfaz
Predicate).
Podríamos escribir una clase, al estilo de lo que hemos hecho con los
Comparator, para establecer las reglas de filtrado que queremos aplicar.
Pero como en esta ocasión el filtrado es sencillo, podemos aplicar el predicado directamente con una expresión lambda.
De nuevo haremos un
stream a partir del ArrayList original que esta vez contendrá solo los objetos que coincidan con el filtro indicado.
Para poder saber si hemos encontrado objetos o no que cumplan el filtro, esta vez en lugar de mostrar en pantalla directamente el
stream lo que haremos será crear un nuevo ArrayList con él.
Así podremos comprobar si dicho ArrayList tiene objetos o está vacío, y así informar apropiadamente en pantalla:
Bueno, pues tras explicar todo esto, esta podría ser la clase
Carrito completa y definitiva.
Fíjate que en el constructor ya añado unos cuantos
Producto, esto es para poder hacer pruebas sin tener que introducir a mano nuevos productos cada vez que iniciamos el programa:
Y ahora solo queda hacer la clase
Main.
Aquí tendremos nuestro
Carrito listo para que el usuario, mediante un menú, pueda añadir más productos, listarlos según atributos y filtrar por la categoría deseada:
Lo importante es comprender cómo hemos empleado la interfaz
Comparator para crear clases que permiten ordenar una colección de distintas formas.
Y lo mismo con la interfaz
Predicate, que en esta ocasión la hemos aplicado mediante una expresión lambda, lo cuál permite ahorrar mucho código.
Es decir, esta expresión que marco en negrita:
Nos ha evitado tener que escribir una clase completa como esta:
Y nada más que añadir.
Espero que se haya entendido. Pregunta lo que necesites.
Un saludo.