Como puedo ordenar con mas de un criterio de ordenación para objetos?

publicado por: Anonymous

Buenas, se como puedo ordenarlo con un criterio de ordenación para objetos teniendo el siguiente codigo

    public class Estudiante  implements Comparable<Estudiante>{
        //Atributos:
        private String nombre;
        private int puntos;
        //Constructores:
        public Estudiante(String nom,int pts){
            this.nombre=nom;
            this.puntos=pts;
        }

        /**
         * @return the nombre
         */
        public String getNombre() {
            return nombre;
        }

        /**
         * @return the puntos
         */
        public int getPuntos() {
            return puntos;
        }

        @Override
        public int compareTo(Estudiante o) {
            return getNombre().compareTo(o.getNombre());
        }


    }











 public class linkelist {

        public static void main(String[] args) {

            LinkedList<Estudiante> lista = new LinkedList<Estudiante>();
            lista.add(new Estudiante("Barbara", 85));
            lista.add(new Estudiante("Xuan", 45));
            lista.add(new Estudiante("Alex", 51));
            lista.add(new Estudiante("Kaka", 52));
            lista.add(new Estudiante("Logi", 53));
            lista.add(new Estudiante("Loki", 54));
            lista.add(new Estudiante("Alexis", 56));
            lista.add(new Estudiante("Zuan", 57));
            Iterator<Estudiante> iterador = lista.listIterator();

            Collections.sort(lista);
            while (iterador.hasNext()) {
                Estudiante e = iterador.next();
                System.out.println(e.getNombre());
            }
        }
    }

Quiero ordenador por nombre y después por puntos

solución

Sobrescribir el método compareTo para hacer la comparación de dos atributos, teniendo en cuenta que Nombre será el que “pese” más.

    @Override
    public int compareTo(Estudiante o) {
        if(getNombre().compareTo(o.getNombre())==0)
            return Integer.compare(getPuntos(), o.getPuntos());
        else 
            return getNombre().compareTo(o.getNombre());
    }

O en una sola línea sería también empleando la interface Comparator

Collections.sort(lista,Comparator.comparing(Estudiante::getNombre).
                 thenComparing(Estudiante::getPuntos));
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *