elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ordenar por nombre y sueldo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ordenar por nombre y sueldo  (Leído 6,892 veces)
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Ordenar por nombre y sueldo
« 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
  1. import java.util.ArrayList;
  2. import java.util.Scanner;
  3.  
  4. public class ejercicio{
  5.  
  6. public static void ordenar(ArrayList<Empleado> empleados){
  7.  
  8. Empleado aux;
  9.  
  10. for(byte i = 0; i<empleados.size(); i++){
  11. if(i<(empleados.size()-1)){
  12. if(empleados.get(i).getNombre().compareToIgnoreCase(empleados.get(i+1).getNombre())>0){
  13. aux = empleados.get(i);
  14. empleados.remove(i);
  15. empleados.add(aux);
  16. }
  17. }
  18. }
  19.  
  20. for(byte i = 0; i<empleados.size(); i++){
  21. if(i<(empleados.size()-1)){
  22. if(empleados.get(i).getNombre().compareToIgnoreCase(empleados.get(i+1).getNombre())==0){
  23. if(empleados.get(i).getSueldo()<empleados.get(i+1).getSueldo()){
  24. aux = empleados.get(i);
  25. empleados.remove(i);
  26. empleados.add(aux);
  27. }
  28. }
  29. }
  30. }
  31.  
  32.  
  33. }
  34.  
  35. public static void main(String[] args) {
  36.  
  37. ArrayList<Empleado> empleados = new ArrayList<Empleado>();
  38.  
  39. Scanner S = new Scanner(System.in);
  40. String resp;
  41.  
  42. do{
  43. char respuesta = 'S';
  44. System.out.print("Introduce el nombre del empleado: ");
  45. String nombre = S.nextLine();
  46.  
  47. System.out.print("Introduce su sueldo: ");
  48. int sueldo = S.nextInt();
  49. System.out.println();
  50. resp = S.nextLine();
  51.  
  52. empleados.add(new Empleado(nombre, sueldo));
  53.  
  54. System.out.println("¿Quieres añadir algún empleado más? (S/N)");
  55. resp = S.nextLine();
  56.  
  57. }while(resp.equalsIgnoreCase("S"));
  58.  
  59. ordenar(empleados);
  60.  
  61. System.out.println("Empleados ordenados por nombre (asc.) y por sueldo(desc.)");
  62. for(byte i = 0; i<empleados.size(); i++){
  63. System.out.println("Empleado [Nombre: "+empleados.get(i).getNombre()+" Sueldo: "+empleados.get(i).getSueldo()+"]");
  64. }
  65.  
  66.  
  67. }
  68.  
  69. }
  70.  

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 Desconectado

Mensajes: 625



Ver Perfil
Re: Ordenar por nombre y sueldo
« Respuesta #1 en: 19 Marzo 2015, 22:37 pm »

No te compliques, usa Comparator para hacer comparaciones personalizadas:

Employee.java

Código
  1. public class Employee {
  2.    private Integer id;
  3.    private String names;
  4.    private Double salary;
  5.  
  6.    public Employee() {}
  7.  
  8.    public Employee(Integer id, String names, Double salary) {
  9.        this.id = id;
  10.        this.names = names;
  11.        this.salary = salary;
  12.    }
  13.  
  14.    public Integer getId() { return id; }
  15.  
  16.    public void setId(Integer id) { this.id = id; }
  17.  
  18.    public String getNames(){ return names; }
  19.  
  20.    public void setNames(String names) { this.names = names; }
  21.  
  22.    public Double getSalary() { return salary; }
  23.  
  24.    public void setSalary(Double salary) { this.salary = salary; }
  25.  
  26.    @Override
  27.    public String toString() {
  28.        return "ID:\t"+id+"\nNombres:\t"+names+"\nSalario:\t"+salary;
  29.    }
  30.  
  31. }

EmployeeUtil.java

Código
  1. import java.util.Collections;
  2. import java.util.Comparator;
  3. import java.util.List;
  4.  
  5. public class EmployeeUtil {
  6.  
  7.    public static void sortByName(List<Employee> employees) {
  8.        Collections.sort(employees, new Comparator<Employee> () {
  9.            @Override
  10.            public int compare(Employee one, Employee two) {
  11.                return one.getNames().compareTo(two.getNames());
  12.            }
  13.        });
  14.    }
  15.  
  16.    public static void sortBySalary(List<Employee> employees) {
  17.        Collections.sort(employees, new Comparator<Employee> () {
  18.            @Override
  19.            public int compare(Employee one, Employee two) {
  20.                return one.getSalary().compareTo(two.getSalary());
  21.            }
  22.        });
  23.    }
  24. }

SortTest.java

Código
  1. import java.util.List;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4.  
  5. public class SortTest {
  6.    public static void main(String[] args) {
  7.        List<Employee> employees = new ArrayList<>();
  8.        Collections.addAll(employees,
  9.                           new Employee(1, "Homer Simpson", 3500d),
  10.                           new Employee(2, "Peter Griffin", 3000d),
  11.                           new Employee(3, "Bugs Bunny", 3500d),
  12.                           new Employee(4, "Chris Redfield", 2500d),
  13.                           new Employee(5, "Alice Abernathy", 3500d)
  14.                          );
  15.  
  16.        System.out.println("Ordenando por nombre...\n");
  17.        EmployeeUtil.sortByName(employees);
  18.        for(Employee employee : employees)
  19.            System.out.println(employee);
  20.  
  21.        System.out.println("\nOrdenando por sueldo...\n");
  22.        EmployeeUtil.sortBySalary(employees);
  23.        for(Employee employee : employees)
  24.            System.out.println(employee);
  25.  
  26.    }
  27. }

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
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 Desconectado

Mensajes: 248



Ver Perfil
Re: Ordenar por nombre y sueldo
« Respuesta #2 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
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Ordenar por nombre y sueldo
« Respuesta #3 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
  1. List<Employee> employees = new ArrayList<>();
  2.        Collections.addAll(employees,
  3.                           new Employee(1, "Homer Simpson", 3500d),
  4.                           new Employee(2, "Peter Griffin", 3000d),
  5.                           new Employee(3, "Bugs Bunny", 3500d),
  6.                           new Employee(4, "Chris Redfield", 2500d),
  7.                           new Employee(5, "Alice Abernathy", 3500d),
  8.                           new Employee(6, "Bugs Bunny", 4200d) // nuevo elemento
  9.                          );

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...

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 Desconectado

Mensajes: 248



Ver Perfil
Re: Ordenar por nombre y sueldo
« Respuesta #4 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 :/
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Ordenar por nombre y sueldo
« Respuesta #5 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
  1. public class A<T> {}

Donde:

  • T significa Type, es decir, tipo de clase.

    Éste elemento T en tiempo de ejecución se transformará en el tipo de clase que tu le especificas:

    Código
    1. A<String> a = new A<>();

    La instrucción anterior crea un objeto tipo A el cual le pasa por medio de Generics el tipo de clase String (para x propósitos). Por ejemplo, List<T> utiliza Generics para saber qué tipos de datos guardar.




    List<T>, como toda interface en Java, NO PUEDE SER INSTANCIADA. List la implementan varias clases, como: ArrayList, LinkedList, entre otras. Entonces, dado que ArrayList implementa List, podríamos decir que:

    Código:
    List = ArrayList

    Entonces, en tiempo de ejecución, puedes hacer esto:

    Código
    1. List<String> list = new ArrayList<>();
    2. list = new LinkedList<>();

    Esto lo que aporte es flexibilidad. La facilidad de cambiar de implementaciones en tiempo real es muy útil.

    Supongamos que tienes una variable de tipo ArrayList:

    Código
    1. ArrayList<String> variable;

    Y tienes un método que realiza una operación. Teniendo "variable" de tipo ArrayList, obligas al método que devuelva un ArrayList. Pero que pasa si "variable" es de tipo List:

    Código
    1. List<String> variable;

    Aquí cambia la cosa. Ahora el método puede devolver muchos tipos de clases:

  • ArrayList
  • LinkedList
  • RoleList
  • AttributeList
  • etc

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!
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 Desconectado

Mensajes: 248



Ver Perfil
Re: Ordenar por nombre y sueldo
« Respuesta #6 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.
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Ordenar por nombre y sueldo
« Respuesta #7 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.
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 Desconectado

Mensajes: 248



Ver Perfil
Re: Ordenar por nombre y sueldo
« Respuesta #8 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
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Calcular sueldo totatal con Java Eclipse
Java
leliCabello 5 11,454 Último mensaje 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 Último mensaje 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 Último mensaje 7 Octubre 2013, 03:36 am
por darking664
Telefónica accede a subir el sueldo de sus instaladores
Noticias
wolfbcn 0 1,301 Último mensaje 4 Junio 2015, 01:52 am
por wolfbcn
¿Cuanto es un sueldo de 1,500€?
Foro Libre
dimitrix 2 2,356 Último mensaje 23 Julio 2015, 00:07 am
por sanson
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines