2011-05-09 22 views
8

¡Buen día!Cómo ordenar un atributo de un objeto utilizando Colecciones

Tengo un estudiante de objeto con los siguientes atributos:

class Student 
    String name 
    Date birthday 

Solía ​​arrayList para almacenar el estudiante Objetos Mi problema es, ¿cómo puedo ordenar la StudentList por el cumpleaños usando los collecitons especie ?.

List <Student> studentList = new ArrayList<Student>(); 

¿Cómo puedo codificarlo?

Collections.sort (????);

Gracias

Respuesta

17

Puede pasar un Comparator a Collections.sort() para manejar la clasificación por fecha de nacimiento:

Collections.sort(studentList, new Comparator<Student>() { 
    public int compare(Student s1, Student s2) { 
     return s1.getBirthday().compareTo(s2.getBirthday()); 
    } 
}); 

Usted Tendrá que agregar getBirthday() a su clase Student si aún no lo tiene.

+0

Gracias @ WhiteFang34 !! ¡Es justo lo que estaba buscando! Pierdo mucho tiempo tratando de ordenar los atributos antes de configurar el objeto. No sabía cómo manejar la clasificación por atributo –

2

Hola, este es un ejemplo que puede ayudar a entender

package de.vogella.algorithms.sort.standardjava; 

import java.util.Comparator; 

public class MyIntComparable implements Comparator<Integer>{ 

    @Override 
    public int compare(Integer o1, Integer o2) { 
     return (o1>o2 ? -1 : (o1==o2 ? 0 : 1)); 
    } 
} 


package de.vogella.algorithms.sort.standardjava; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class Simple2 { 
    public static void main(String[] args) { 
     List<Integer> list = new ArrayList<Integer>(); 
     list.add(5); 
     list.add(4); 
     list.add(3); 
     list.add(7); 
     list.add(2); 
     list.add(1); 
     Collections.sort(list, new MyIntComparable()); 
     for (Integer integer : list) { 
      System.out.println(integer); 
     } 
    } 
} 
1

Necesita escribir un comparador personalizado.

Algo así como:

Collections.sort(studentList, new Comparator<Student>() { 

    public int compare(Strudent a, Strudent b) { 
     return a.birthday.compareTo(b.birthday); 
    } 

}); 
4

En Java 8 puede ordenar la lista con un trazador de líneas usando Lambda expressions y Comparator. comparing:

Collections.sort(studentList, Comparator.comparing(s -> s.getBirthday())); 

Alternativamente, puede utilizar el método de referencia:

Collections.sort(studentList, Comparator.comparing(Student::getBirthday)); 
0

Esto puede ser una pregunta de la entrevista complicado :)

La forma mejor y reutilizable que he encontrado para resolver un similares El problema fue implementar la interfaz Comparator y también crear comparadores personalizados de acuerdo con mis necesidades, que pueden reutilizarse.

Dejo aquí un ejemplo de cómo ordenar una ArrayList of Person según su atributo de nombre y también según su atributo de género (que no tiene ningún orden natural de lexicografía).

El truco era definir una clase enum con el atributo personalizado del que quería ordenar. Al aplicar un comparador personalizado a ese atributo enum, el método compareTo() aplica el orden de acuerdo con el orden natural en el que se declaran los valores (en este ejemplo, masculino, femenino, otros).

import java.util.*; 

public class Person { 

public enum Gender { 
    male,female, others 
} 

String name; 
int age; 
Gender gender; 

public Person(String name, int age, Gender gender) { 
    this.name = name; 
    this.age = age; 
    this.gender = gender; 
} 

public String getName() { 
    return name; 
} 

public Gender getGender() { 
    return gender; 
} 

@Override 
public String toString() { 
    return "Person{" + 
      "name='" + name + '\'' + 
      ", age=" + age + 
      ", gender='" + gender + '\'' + 
      '}'; 
} 

public static void printPersons(List<Person> personList) { 

    for (int i = 0; i < personList.size(); i++) { 
     System.out.println(personList.get(i).toString()); 
    } 
} 

public static void printSortedByAgePersons(List<Person> personList) { 
    Collections.sort(personList, Person.COMPARE_BY_NAME); 
    for (int i = 0; i < personList.size(); i++) { 
     System.out.println(personList.get(i).toString()); 
    } 
} 

public static void printSortedByGender(List<Person> personList) { 
    Collections.sort(personList, Person.COMPARE_BY_GENDER); 
    printPersons(personList); 
} 

public static Comparator<Person> COMPARE_BY_NAME = new Comparator<Person>() { 
    @Override 
    public int compare(Person o1, Person o2) { 
     return o1.getName().compareTo(o2.getName()); 
    } 
}; 

public static Comparator<Person> COMPARE_BY_GENDER = new Comparator<Person>() { 
    @Override 
    public int compare(Person o1, Person o2) { 
     return o1.getGender().compareTo(o2.getGender()); 
    } 
}; 


// lets test this : 
public static void main(String args[]) { 

    Person p1 = new Person("André", 22, Gender.male); 
    Person p2 = new Person("Minder", 19, Gender.others); 
    Person p4 = new Person("Maria", 19, Gender.female); 
    Person p3 = new Person("Pedro", 25, Gender.male); 

    List<Person> personList = new ArrayList<Person>(); 
    personList.add(p1); 
    personList.add(p2); 
    personList.add(p3); 
    personList.add(p4); 

    System.out.println("original list:"); 
    printPersons(personList); 

    System.out.println("------------------------------------------"); 
    System.out.println("sorted list by name in alphabetical order"); 
    printSortedByAgePersons(personList); 

    System.out.println("------------------------------------------"); 
    System.out.println("sorted list by custom order(gender)"); 
    printSortedByGender(personList); 

} 

} 
Cuestiones relacionadas