Hola, bueno pensaba usar el "año mes día" aaaammdd, como recomiendas, ...¿como se podria hacer esto? Gracias.
P.d. Estamos intentando eliminar productos o vendedores, alguna idea para realizarlo?
Vale usando ese formato es muy fácil ordenar.
Explico:
Colecciones como ArrayList tienen un método que permite ordenar los objetos que contiene. Es el método .sort().
Para usar este método hay dos maneras:
- Le pasamos por argumentos en el paréntesis una expresión para indicarle al ArrayList como debe ordenar los objetos que contiene..
- Le pasamos valor null, y confiamos en que el ArrayList sepa como ordenarse.
La primera manera puede ser algo complicado saber construir correctamente dicha expresión.
La segunda manera es la más fácil, pero claro, dependemos de que el ArrayList sepa ordenarse.
Aunque lo cierto, es que esto no depende del ArrayList, sino de los objetos que contiene. Son ellos los que tienen que saber como "compararse" unos con otros para decidir quien es menor y quien es mayor.
Los objetos que saben "compararse", son los que su clase implementa la interfaz
ComparablePor ejemplo los objetos de clases que representan números: Integer, Double, Float.... sí la implementan y por eso saben perfectamente que un 4 es menor que un 5.
La clase String, también la implementa, así que saben perfectamente que la cadena "b" es menor que la cadena "c".
Así que nunca tendremos problemas para ordenar un ArrayList de Integer o de String, basta con llamar a sort(null) y se ordenará al momento el solito.
Pero nuestro ArrayList de Registro de Facturas, va a contener objetos de la clase Factura.
Una clase que hemos creado nosotros y que sus objetos no saben como compararse para decidir quien es menor o mayor.
Así que ahora mismo nuestro ArrayList de Facturas, no sabe como ordenar sus objetos.
Pero para eso estamos nosotros, para enseñarle a la clase Factura como compararse.
Lo primero es implementarle la interfaz
Comparable, indicándole el tipo de clase con el que se tiene que comparar, que lo normal es que sea ella misma.
public class Factura implements Comparable<Factura>{
......
......
Al implementar esta interfaz, el compilador inmediatamente nos obliga a implementar también el método
compareTo().
Este método es el que explica como ha de compararse un objeto y ha de retorna un int.
Si los objetos se consideran del "mismo valor" ha de retorna 0
Si el objeto recibido por argumentos, es mayor respecto al objeto que invoca el método, ha de retornar -1.
Si el objeto recibido es menor, entonces ha de retornar 1.
Bien, en nuestro caso, tendríamos que escribir un código que compare las fechas.
Podemos ordenarlas de modo que las fechas más antiguas se consideren menores que las fechas más recientes.
Es decir, la fecha 20191105 es menor que la fecha 20191205, porque esta última es más reciente.
Bueno, para hacer esto podríamos empezar a trocear el String que contiene la fecha, para separar el valor del año, del mes y del dia...y parsearlos a valores int, y entonces....
Pero, ¡¡espera!!. Hemos dicho antes que los objetos String ya saben compararse. Y precisamente se comparan de forma que coincide a como queremos ordenar las fechas.
El String "20191105" se considera menor que el String "20191205".
Es más, podemos usar separadores como guiones y la comparación de String fucnionará igual.
"2019-11-05" es menor que "2019-12-05".
Así que no tenemos que hacer nada, tan solo decirle a nuestro método compareTo(), que retorne el resultado de comparar directamente los String de fechas.
@Override
public int compareTo(Factura otraFactura) {
return fecha.compareTo(otraFactura.getFecha());
}
Genial, ahora nuestra clase Factura ya sabe como compararse unas con otras para decidir cual es menor o mayor, en función de su fecha.
Ahora lo que podemos hacer es decirle a nuestra clase de
Registro de Facturas, que cada vez que entre una nueva Factura en el ArrayList, lo ordene. Así siempre estará ordenado tras cada inserción.
public boolean addFactura(Factura factura) {
if (facturas.contains(factura))
return false;
else {
facturas.add(factura);
facturas.sort(null); //Null es porque las Facturas ya saben como compararse para ordenarse
return true;
}
}
Con esto, si desde el programa principal, tras haber hecho algunas facturas pedimos un listado, veremos que salen ordenadas por fecha, de más antigua a más moderna.
Las facturas de este listado yo las he ido creando por orden de ID: FAC01, FAC02, FAC03 y FAC04.
Pero al entrar en el ArrayList, se han ido ordenando por la fecha.
FACTURAS REGISTRADAS
ID: FAC03 Fecha: 2018-12-12
Notas: jiol
ID: FAC02 Fecha: 2019-06-14
Notas: popop
ID: FAC01 Fecha: 2019-06-15
Notas: fasdfsa
ID: FAC04 Fecha: 2019-08-15
Notas: sdafsa
Bueno, ¿y si queremos que el orden sea al revés? ¿De más reciente a más antiguas?
Entonces bastaría con modificar el método comparteTo() de la clase Factura, diciéndole que modifique el signo del resultado de comparar los Strings de fechas.
Cuando el resultado sea -1, ha de devolver +1 y viceversa.
Para hacer esto, puesto que somos grandes matemáticos xD, ya sabemos que nos basta con multiplicar lo que retorna, por -1
@Override
public int compareTo(Factura otraFactura) {
return fecha.compareTo(otraFactura.getFecha()) * -1;
}
Esto revierte a como se ordenan las facturas, ahora las fechas recientes se consideran menores que las antiguas:
FACTURAS REGISTRADAS
ID: FAC04 Fecha: 2019-08-15
Notas: sdafad
ID: FAC01 Fecha: 2019-06-15
Notas: fsadfa
ID: FAC02 Fecha: 2019-06-14
Notas: popop
ID: FAC03 Fecha: 2018-12-12
Notas: jiol
Y ya está.
Cierto es que hemos optado por la via fácil, usar un String con formato aaaa-mm-dd.
Y ojo, es que ese formato de fecha cumple en realidad con la norma ISO 8601 y es la que se suele usar en informática precisamente por esto, porque facilita mucho la ordenación alfanumérica.
Sin embargo en la mayoría de paises de habla hispana, lo habitual es usar dd-mm-aaaa.
Pero bueno, no creo que sea necesario ahora pelearse con formatos de fecha.
Lo importante aquí es aprender que para ordenar objetos, podemos hacerlo implementado la interfaz
Comparable y decidir nosotros que atributos son decisivos para hacer la comparación.
En el
Curso de Java Avanzado tienes un ejemplo algo más elaborado.
Sabiendo ya esto, puedes decidir ya si quieres usar otro formato de fecha, o usar clases como
LocalDateEn ambos casos ya se requiere meter más programación.
Respecto a esto:
P.d. Estamos intentando eliminar productos o vendedores, alguna idea para realizarlo?
Los ArrayList tienen el metodo remove() que debería permitirte hacer esto fácilmente.
Por ejemplo, en la clase Inventario, si quiero eliminar un Producto de su ArrayLsit, me basta con escribirle este método:
public boolean eliminarProducto(Producto producto) {
return productos.remove(producto);
}
Este método recibe un objeto Producto que es el que se ha de eliminar.
Así que se lo pase al método remove() del ArrayList.
remove() lo que hace es que si dicho Producto existe en el ArrayList, lo elimina y retorna true.
Si no existiera, entonces retorna false.
Entonces, en el programa principal, cuando el usuario active la opción "eliminar Producto", tu tendrás que pedirle al usuario el ID de producto que quiere eliminar.
Con ese ID construyes un objeto Producto y se lo pasas a este método para que lo elimine del ArrayList de Inventario.
No hace falta que construyas un Producto con los datos idénticos a como esté en el ArrayList. No necesitas saber la cantidad ni la descripción del producto ni ningún otro valor, solo el ID.
Recuerda que Producto tiene un método llamado equals() en donde se indica que dos objetos Producto son IGUALES si coincide su ID.
Así que te basta con construir un Producto con el ID indicado, y el resto de parámetros del constructor pueden tener cualquier valor, no importa. Solo necesitas que coincida el ID.
Por ejemplo, mi clase Producto que escribí para este ejercicio, si recuerdas, tiene dos constructores y uno solo pide un String con el ID y un valor int para la cantidad.
Yo a ese int le puedo poner cualquier valor, no tiene que coincidir con la cantidad que marca el Inventario para poder borrarlo.
El código podría ser algo así:
System.out.print("Indique el ID del producto a eliminar: ")
String idPRoducto = stdIn.readLine();
if (inventario.eliminarProducto(new Producto(idProducto, 0)) //Pongo una cantidad cualquiera
System.out.println("Producto ha sido eliminado");
else
System.out.println("No hay ningún Producto con ese ID en el Inventario");