Título: Ordenar por nombre y sueldo Publicado por: Baal_30 en 19 Marzo 2015, 20:59 pm Buenas, antes que nada pedir disculpas por ser tan pesado y por mi falta de conocimientos :/
El problema es que necesito ordenar un ArrayList de objetos que tienen String (nombre) y un int (sueldo), he hecho un método y si pongo 4 empleados si que me los ordena y parece que funciona bien, pero he probado con más y no funciona como debería :/ Aquí está el código: Código
No entiendo en que falla :/ Gracias de antemano y un saludo ¡! Título: Re: Ordenar por nombre y sueldo Publicado por: Usuario Invitado en 19 Marzo 2015, 22:37 pm No te compliques, usa Comparator para hacer comparaciones personalizadas:
Employee.java Código
EmployeeUtil.java Código
SortTest.java Código
Como puedes ver, el método sort de Collections acepta un objeto Comparator que implementa el método compare que lo puedes sobreescribir para hacer una comparación personalizada a través de compareTo. Como puedes observar, he personalizado dos sobreescrituras de compare para uno ordene por nombres y el otro por salario. Resultado de la ejecución: Código: > run SortTest Título: Re: Ordenar por nombre y sueldo Publicado por: Baal_30 en 20 Marzo 2015, 13:33 pm Gracias Gus por la respuesta ¡! Pero me cuesta comprender el código :/ Pero una cosita, como se debe ordenar es por nombre, y en caso de que algunos se llamen igual, se ordenarán por sueldo, me expliqué yo mal :P
Título: Re: Ordenar por nombre y sueldo Publicado por: Usuario Invitado en 20 Marzo 2015, 15:45 pm El código que expuse hace eso. sortByName ordena por nombres. En caso hayan dos o más empleados con nombres iguales (muy raro en una misma empresa pero puede suceder), se ordenarán por sueldo. He modificado un poco SortTest:
Código
Y como puedes ver en la salida, aunque Bugs Bunny aparezca dos veces en la lista de empleados, se ordenan de acuerdo al sueldo. Esto lo hace automáticamente compare. Si dos propiedades son idénticas, compara la siguiente propiedad en busca de diferencias para poder ordenar. Código: Ordenando por nombre... Dime qué cosas no entiendes del código y trataré de explicártelo. Título: Re: Ordenar por nombre y sueldo Publicado por: Baal_30 en 22 Marzo 2015, 15:16 pm No entiendo porque usas List en vez de ArrayList ni en que se diferencian.
Tampoco entiendo el : Collections.addAll Ni el : Collections.sort Ni el public int compare Y en la clase del objeto Empleado, ¿porque Integer en vez de int? :/ Prácticamente no entiendo lo que hacen los métodos que utilizas ni como funciona exactamente el código, estoy muy perdido :( Disculpas por la ignoracia :/ Título: Re: Ordenar por nombre y sueldo Publicado por: Usuario Invitado en 22 Marzo 2015, 23:21 pm Buenas tardes,
Te iré explicando punto por punto para que puedas entenderlo. 1.- Citar No entiendo porque usas List en vez de ArrayList ni en que se diferencian. Rpta: Java está muy bien estructurado y siguiendo siempre las buenas prácticas de programación, así como implementado patrones de diseño para que proveernos una API muy organizada. En Java, existe un elemento llamado Generics, y es un elemento que sirve para hacer nuestras clases más descriptivas para el compilador, así como también nos permite construir clases genéricas (véase el término genérico). Generics, como ya dije, se usa para hacer nuestras clases más sólidas y flexibles. La manera de usar Generics es la siguiente: Código
Donde:
Como puedes ver, esto aporta mucha flexibilidad. Porque dependiendo del proceso del método, puedes devolver muchas implementaciones de List y todas serán aceptadas por "variable". 2.- Citar Tampoco entiendo el : Collections.addAll Mira la documentación, acostúmbrate a hacerlo. El método all de la clase Collections recibe como primer parámetro un objeto tipo Collection (que puede ser una implementación de List<T>) y un ellipsis de elementos T que serán añadidos al objeto List<T>. 3.- Citar Ni el : Collections.sort El método sort de Collections ordena un objeto Collection. Si no se especifica un objeto tipo Comparator se usa el método de ordenamiento por defecto. Si se especifica un objeto Comparator se usa éste para comparar los elementos de la colección. 4.- Citar Ni el public int compare El objeto Comparator implemena un método llamado compare(T obj1, T obj2), que retorna -1 0 o 1 si obj1 es menor, igual o mayor que obj2. La interface Comparable provee el método compareTo cuya implementación es similar a compare de la interface Comparator. En resumen, compare recibe elementos en par de la colección pasada a sort y compara el par de elementos. De acuerdo al resultado (-1, 0 o 1), ordenará los elementos de la colección. Cuando ya no haya elementos, retorna la colección ordenada. 5.- Citar Y en la clase del objeto Empleado, ¿porque Integer en vez de int? :/ Preferencia personal. Prefiero los Wrapper a los primitivos, puedes hacer muchas más cosas. Con los primitivos no tienes ningún método a disposición. Espero hayas entendido, si no es así, no te preocupes, en serio. A mí también me costó entenderlo, pero al final lo terminas aprendiendo. ¡Un saludo y no te desanimes! Título: Re: Ordenar por nombre y sueldo Publicado por: Baal_30 en 24 Marzo 2015, 10:01 am Uff muchas gracias Gus por las molestias que te has tomado en responderme, de verdad que te lo agradezco mucho ¡!
Sólo me queda una duda más, y es en cuanto se comparan dos objetos, ¿que reglas sigue para compararlos? En el ejemplo de empleado, con un String nombre y un int sueldo, ¿primero empieza a comparar los strings, y luego los sueldos? ¿o en que se basa para comparar dos objetos que contienen varios atributos? Un abrazo. Título: Re: Ordenar por nombre y sueldo Publicado por: Usuario Invitado en 24 Marzo 2015, 19:27 pm El método sort, por defecto, ordena los elementos en forma ascendente. Si los elementos son objetos y no se especifica un objeto que sobreescriba la comparación por defecto (utilizando las interfaces Comparable y Comparator), la VM lanzará un java.lang.Error con el siguiente mensaje:
Citar Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (ArrayList). The inferred type Empleado is not a valid substitute for the bounded parameter > at ... Si tu List contiene objetos y quieres ordenarlos, deberás de reemplazar el ordenamiento por defecto por uno proveído por las interfaces Comparator y Comparable. Saludos. Título: Re: Ordenar por nombre y sueldo Publicado por: Baal_30 en 25 Marzo 2015, 13:16 pm Ummm de acuerdo, no es tan fácil como pensaba entonces :/ jaja
Muchas gracias por la ayuda Gus ¡¡!! :D |