Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Implementando Comparator con objetos

Estas en el tema de Implementando Comparator con objetos en el foro de Java en Foros del Web. Buenas a todos, tengo una consulta para hacer, resulta que tengo una clase Cargo que tiene como atributos id y nombre, luego tengo otra clase ...
  #1 (permalink)  
Antiguo 13/02/2019, 19:41
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 417
Antigüedad: 8 años, 3 meses
Puntos: 6
Implementando Comparator con objetos

Buenas a todos, tengo una consulta para hacer, resulta que tengo una clase Cargo que tiene como atributos id y nombre, luego tengo otra clase llamada Persona que tiene como atributos id, nombre y el cargo que tiene.
Resulta que quiero ordenar las personas por cargos y cuando hago dicha ordenación me borra la anterior persona con el cargo repetido.

Pongo el código:

Código Java:
Ver original
  1. package app.contr.clases;
  2. public class Cargo implements Comparable<Cargo>
  3. {
  4.     private int id;
  5.     private String nom;
  6.     public static int autoID = 0;
  7.     public int getId() {
  8.         return id;
  9.     }
  10.     public void setId(int id) {
  11.         this.id = id;
  12.     }
  13.     public String getNom() {
  14.         return nom;
  15.     }
  16.     public void setNom(String nom) {
  17.         this.nom = nom;
  18.     }
  19.     public Cargo(int xid, String xnom) {
  20.         this.id = xid;
  21.         this.nom = xnom.toUpperCase();
  22.     }
  23.     @Override
  24.     public boolean equals(Object obj) {
  25.         if(obj instanceof Cargo){
  26.             Cargo objc = (Cargo)obj;
  27.             return objc.nom.equals(this.nom);
  28.         }
  29.         else
  30.             return false;
  31.     }
  32.     @Override
  33.     public int hashCode() {
  34.         int hash = 17;
  35.         hash = 31 * hash + this.nom.hashCode();
  36.         return hash;
  37.     }
  38.     @Override
  39.     public String toString() {
  40.         return nom;
  41.     }    
  42.     @Override
  43.     public int compareTo(Cargo o) {
  44.         if (this.nom.compareTo(o.getNom()) > 0)
  45.             return 1;
  46.         else if (this.nom.compareTo(o.getNom()) < 0)
  47.             return -1;
  48.         else
  49.             return 0;
  50.     }
  51.     public static int obtenerMAXID(){
  52.         return autoID + 1;
  53.     }
  54.     public static void incrementarID(){
  55.         autoID++;
  56.     }
  57. }

Código Java:
Ver original
  1. package app.contr.clases;
  2. public class Persona
  3. {
  4.     private final int id;
  5.     private String nom;
  6.     private Cargo cargo;
  7.     public static int autoID = 0;
  8.     public int getId() {
  9.         return id;
  10.     }
  11.     public String getNom() {
  12.         return nom;
  13.     }
  14.     public void setNom(String nom) {
  15.         this.nom = nom;
  16.     }  
  17.     public Cargo getCargo() {
  18.         return cargo;
  19.     }
  20.     public void setCargo(Cargo cargo) {
  21.         this.cargo = cargo;
  22.     }
  23.     public Persona(int xid, String xnom, Cargo xcargo) {
  24.         this.id = xid;
  25.         this.nom = xnom.toUpperCase();
  26.         this.cargo = xcargo;
  27.     }    
  28.     @Override
  29.     public boolean equals(Object obj) {
  30.         if(obj instanceof Persona){
  31.             Persona objp = (Persona)obj;
  32.             return objp.nom.equals(this.nom);
  33.         }
  34.         else
  35.             return false;
  36.     }
  37.     @Override
  38.     public int hashCode() {
  39.         int hash = 17;
  40.         hash = 31 * hash + this.nom.hashCode();
  41.         return hash;
  42.     }    
  43.     @Override
  44.     public String toString() {
  45.         return nom;
  46.     }
  47.     public static int obtenerMAXID(){
  48.         return autoID+1;
  49.     }
  50.     public static void incrementarID(){
  51.         autoID++;
  52.     }
  53. }

Ordena personas por cargo de forma creciente:

Código Java:
Ver original
  1. package app.vista.util;
  2. import app.contr.clases.Persona;
  3. import app.vista.facade.FacadeContr;
  4. import java.util.Comparator;
  5. public class OrdenarPerXCA implements Comparator<Integer>
  6. {
  7.     @Override
  8.     public int compare(Integer o1, Integer o2) {
  9.         Persona p1 = FacadeContr.getInstance().ContrPersonas().findAll().get(o1);
  10.         Persona p2 = FacadeContr.getInstance().ContrPersonas().findAll().get(o2);
  11.         return p1.getCargo().getNom().compareTo(p2.getCargo().getNom());        
  12.     }    
  13. }

Ordena personas por cargo de forma decreciente:

Código Java:
Ver original
  1. package app.vista.util;
  2. import app.contr.clases.Persona;
  3. import app.vista.facade.FacadeContr;
  4. import java.util.Comparator;
  5. public class OrdenarPerXCD implements Comparator<Integer>
  6. {
  7.     @Override
  8.     public int compare(Integer o1, Integer o2) {
  9.         Persona p1 = FacadeContr.getInstance().ContrPersonas().findAll().get(o1);
  10.         Persona p2 = FacadeContr.getInstance().ContrPersonas().findAll().get(o2);
  11.         return p2.getCargo().getNom().compareTo(p1.getCargo().getNom());
  12.     }    
  13. }

Necesito solucionar esta falla y no sé cómo, espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #2 (permalink)  
Antiguo 14/02/2019, 02:50
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.501
Antigüedad: 10 años, 10 meses
Puntos: 188
Respuesta: Implementando Comparator con objetos

¿y dónde está el código que se ejecuta en el main, que es el meollo de la cuestión?
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 14/02/2019, 09:15
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 730
Antigüedad: 11 años, 1 mes
Puntos: 60
Respuesta: Implementando Comparator con objetos

Bien extraños tus comparators. Si quieres comparar personas, independiente del criterio, son personas las que deberían ser los parámetros del comparator.
__________________
Visita mi perfil en LinkedIn
  #4 (permalink)  
Antiguo 14/02/2019, 10:14
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.501
Antigüedad: 10 años, 10 meses
Puntos: 188
Respuesta: Implementando Comparator con objetos

el comparator es un sistema de ordenación en base a una propiedad del objeto. Si quiere usar el nombre del cargo está en su derecho.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 14/02/2019, 14:04
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 730
Antigüedad: 11 años, 1 mes
Puntos: 60
Respuesta: Implementando Comparator con objetos

Cuando comparas 2 objetos X con la propiedad Y, lo que pasas al comparator es el tipo de X, no el de Y. El campo Y es parte de la implementación del comparator, no de sus parámetros. Eso es lo que comento.
__________________
Visita mi perfil en LinkedIn
  #6 (permalink)  
Antiguo 15/02/2019, 10:36
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 417
Antigüedad: 8 años, 3 meses
Puntos: 6
Respuesta: Implementando Comparator con objetos

Muchas gracias FuzzyLog y CargaryCorpus por responder, verán hasta intenté que me ordene por el cargo sólo para apelar al compareTo implementado en la clase Cargo:

Código Java:
Ver original
  1. package app.vista.util;
  2. import app.contr.clases.Persona;
  3. import app.vista.facade.FacadeContr;
  4. import java.util.Comparator;
  5. public class OrdenarPerXCD implements Comparator<Integer>
  6. {
  7.     @Override
  8.     public int compare(Integer o1, Integer o2) {
  9.         Persona p1 = FacadeContr.getInstance().ContrPersonas().findAll().get(o1);
  10.         Persona p2 = FacadeContr.getInstance().ContrPersonas().findAll().get(o2);
  11.         return p2.getCargo().compareTo(p1.getCargo());
  12.     }    
  13. }

Pero el resultado es el mismo, que me elimina a la persona anterior con el cargo repetido, sí tengo una función que me valida si una entrada con tal clave para evitar duplicados sólo que si ignoro esa función al ordenar me da este error:

Cita:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index 3 out-of-bounds for length 3
Y ahí me deja con cara de ¿que voy a a hacer?

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #7 (permalink)  
Antiguo 16/02/2019, 21:00
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 417
Antigüedad: 8 años, 3 meses
Puntos: 6
Respuesta: Implementando Comparator con objetos

Tengo que pedirles disculpas porque fue una tontería mía este post, hice las pruebas pertinentes comparando el desarrollo que estoy haciendo con el original, y ambos funcionan igual ya que el compareTo del original y el que estoy haciendo no aceptan duplicados para la estructura de datos.

Gracias por el tiempo dedicado a este post inútil, nuevamente pido disculpas.

Saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias



La zona horaria es GMT -6. Ahora son las 12:07.