Autor
|
Tema: Ordenar por nombre y sueldo (Leído 6,892 veces)
|
Baal_30
Desconectado
Mensajes: 248
|
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: import java.util.ArrayList; import java.util.Scanner; public class ejercicio{ public static void ordenar(ArrayList<Empleado> empleados){ Empleado aux; for(byte i = 0; i<empleados.size(); i++){ if(i<(empleados.size()-1)){ if(empleados.get(i).getNombre().compareToIgnoreCase(empleados.get(i+1).getNombre())>0){ aux = empleados.get(i); empleados.remove(i); empleados.add(aux); } } } for(byte i = 0; i<empleados.size(); i++){ if(i<(empleados.size()-1)){ if(empleados.get(i).getNombre().compareToIgnoreCase(empleados.get(i+1).getNombre())==0){ if(empleados.get(i).getSueldo()<empleados.get(i+1).getSueldo()){ aux = empleados.get(i); empleados.remove(i); empleados.add(aux); } } } } } public static void main (String[] args ) { ArrayList<Empleado> empleados = new ArrayList<Empleado>(); Scanner S = new Scanner (System. in); do{ char respuesta = 'S'; System. out. print("Introduce el nombre del empleado: "); System. out. print("Introduce su sueldo: "); int sueldo = S.nextInt(); resp = S.nextLine(); empleados.add(new Empleado(nombre, sueldo)); System. out. println("¿Quieres añadir algún empleado más? (S/N)"); resp = S.nextLine(); }while(resp.equalsIgnoreCase("S")); ordenar(empleados); System. out. println("Empleados ordenados por nombre (asc.) y por sueldo(desc.)"); for(byte i = 0; i<empleados.size(); i++){ System. out. println("Empleado [Nombre: "+empleados. get(i ). getNombre()+" Sueldo: "+empleados. get(i ). getSueldo()+"]"); } } }
No entiendo en que falla :/ Gracias de antemano y un saludo ¡!
|
|
|
En línea
|
«La suerte es el cuidado de los detalles». -Winston Churchill
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
No te compliques, usa Comparator para hacer comparaciones personalizadas: Employee.javapublic class Employee { public Employee() {} this.id = id; this.names = names; this.salary = salary; } public Integer getId () { return id ; } public void setId (Integer id ) { this. id = id ; } public String getNames (){ return names ; } public void setNames (String names ) { this. names = names ; } public Double getSalary () { return salary ; } public void setSalary (Double salary ) { this. salary = salary ; } @Override return "ID:\t"+id+"\nNombres:\t"+names+"\nSalario:\t"+salary; } }
EmployeeUtil.javaimport java.util.Collections; import java.util.Comparator; import java.util.List; public class EmployeeUtil { public static void sortByName(List<Employee> employees) { Collections. sort(employees, new Comparator <Employee > () { @Override public int compare(Employee one, Employee two) { return one.getNames().compareTo(two.getNames()); } }); } public static void sortBySalary(List<Employee> employees) { Collections. sort(employees, new Comparator <Employee > () { @Override public int compare(Employee one, Employee two) { return one.getSalary().compareTo(two.getSalary()); } }); } }
SortTest.javaimport java.util.List; import java.util.ArrayList; import java.util.Collections; public class SortTest { public static void main (String[] args ) { List<Employee> employees = new ArrayList<>(); new Employee(1, "Homer Simpson", 3500d), new Employee(2, "Peter Griffin", 3000d), new Employee(3, "Bugs Bunny", 3500d), new Employee(4, "Chris Redfield", 2500d), new Employee(5, "Alice Abernathy", 3500d) ); System. out. println("Ordenando por nombre...\n"); EmployeeUtil.sortByName(employees); for(Employee employee : employees) System. out. println("\nOrdenando por sueldo...\n"); EmployeeUtil.sortBySalary(employees); for(Employee employee : employees) } }
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: > run SortTest Ordenando por nombre...
ID: 5 Nombres: Alice Abernathy Salario: 3500.0 ID: 3 Nombres: Bugs Bunny Salario: 3500.0 ID: 4 Nombres: Chris Redfield Salario: 2500.0 ID: 1 Nombres: Homer Simpson Salario: 3500.0 ID: 2 Nombres: Peter Griffin Salario: 3000.0
Ordenando por sueldo...
ID: 4 Nombres: Chris Redfield Salario: 2500.0 ID: 2 Nombres: Peter Griffin Salario: 3000.0 ID: 5 Nombres: Alice Abernathy Salario: 3500.0 ID: 3 Nombres: Bugs Bunny Salario: 3500.0 ID: 1 Nombres: Homer Simpson Salario: 3500.0
|
|
|
En línea
|
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
|
|
|
Baal_30
Desconectado
Mensajes: 248
|
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
|
|
|
En línea
|
«La suerte es el cuidado de los detalles». -Winston Churchill
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
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: List<Employee> employees = new ArrayList<>(); new Employee(1, "Homer Simpson", 3500d), new Employee(2, "Peter Griffin", 3000d), new Employee(3, "Bugs Bunny", 3500d), new Employee(4, "Chris Redfield", 2500d), new Employee(5, "Alice Abernathy", 3500d), new Employee(6, "Bugs Bunny", 4200d) // nuevo elemento );
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. Ordenando por nombre...
ID: 5 Nombres: Alice Abernathy Salario: 3500.0 ID: 3 Nombres: Bugs Bunny Salario: 3500.0 ID: 6 Nombres: Bugs Bunny Salario: 4200.0 ID: 4 Nombres: Chris Redfield Salario: 2500.0 ID: 1 Nombres: Homer Simpson Salario: 3500.0 ID: 2 Nombres: Peter Griffin Salario: 3000.0
Dime qué cosas no entiendes del código y trataré de explicártelo.
|
|
« Última modificación: 20 Marzo 2015, 16:01 pm por Gus Garsaky »
|
En línea
|
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
|
|
|
Baal_30
Desconectado
Mensajes: 248
|
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 :/
|
|
|
En línea
|
«La suerte es el cuidado de los detalles». -Winston Churchill
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
Buenas tardes, Te iré explicando punto por punto para que puedas entenderlo. 1.- 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: public class A<T> {}
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.- 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.- 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.- 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.- 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!
|
|
|
En línea
|
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
|
|
|
Baal_30
Desconectado
Mensajes: 248
|
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.
|
|
|
En línea
|
«La suerte es el cuidado de los detalles». -Winston Churchill
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
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: 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.
|
|
|
En línea
|
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
|
|
|
Baal_30
Desconectado
Mensajes: 248
|
Ummm de acuerdo, no es tan fácil como pensaba entonces :/ jaja Muchas gracias por la ayuda Gus ¡¡!!
|
|
|
En línea
|
«La suerte es el cuidado de los detalles». -Winston Churchill
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Calcular sueldo totatal con Java Eclipse
Java
|
leliCabello
|
5
|
11,454
|
31 Octubre 2009, 17:52 pm
por leliCabello
|
|
|
ordenar por nombre o deuda con la función qsort
Programación C/C++
|
minette1988
|
2
|
3,836
|
2 Junio 2010, 15:23 pm
por Gallu
|
|
|
[Ayuda] Ordenar por edad y por nombre, datos de un struct.
Programación C/C++
|
darking664
|
4
|
17,333
|
7 Octubre 2013, 03:36 am
por darking664
|
|
|
Telefónica accede a subir el sueldo de sus instaladores
Noticias
|
wolfbcn
|
0
|
1,301
|
4 Junio 2015, 01:52 am
por wolfbcn
|
|
|
¿Cuanto es un sueldo de 1,500€?
Foro Libre
|
dimitrix
|
2
|
2,356
|
23 Julio 2015, 00:07 am
por sanson
|
|