Нужно сделать сортировку ArrayList <Object>для определенного поля? - PullRequest
0 голосов
/ 23 декабря 2011

Мне нужно отсортировать мой ArrayList по дате, которая находится в объекте Student ... Если дата (дата присоединения) совпадает, то мне нужно отсортировать ее по ID ... как это сделать?

Ответы [ 6 ]

3 голосов
/ 23 декабря 2011

Это можно сделать двумя распространенными способами.

Простой способ

1) Попросить ученика внедрить Comparable, что в конечном итоге будет отложено до даты. Это очень простая операция, но она немного взломана.

Обслуживаемый способ

2) В качестве альтернативы метод Collections.sort принимает в качестве входных данных компаратор - и вы можете легко написать собственный компаратор, который реализует сравнение, необходимое для сортировки, путем преобразования входных данных в классы учеников и непосредственного возврата сравнения данных.

Второе решение является более модульным и обслуживаемым, если сравнение по дате не является фундаментальным, центральным аспектом вашего приложения.

2 голосов
/ 23 декабря 2011

Реализуйте Сопоставимый интерфейс в вашем классе ученика.Тогда используйте Collections.sort(list);

1 голос
/ 23 декабря 2011
  1. Если класс Student реализует Comparable на основе поля идентификатора, используйте Collections.sort () со списком в качестве одного параметра.

  2. В противном случае реализуйтеКомпаратор, который сравнивает объекты по их идентификатору и использует его в качестве второго параметра для Collections.sort ().

1 голос
/ 23 декабря 2011

Вы можете сделать это одним из двух способов:

1) Реализовать интерфейс Comparable на вашем объекте и вызвать `Collections.sort (yourList); '.

Или

2) Реализовать интерфейс Comparator новым классом (давайте представим, что вы называете этот класс StudentDateComparator. Затем вы можете вызвать Collections.sort (yourList, newStudentDateComparator ()); `.

Я обычно предпочитаю последнее, так как оно позволяет хранить код сортировки отдельно от сортируемого объекта данных.

1 голос
/ 23 декабря 2011

Класс Collections имеет метод сортировки, который принимает Comparator в качестве аргумента:

List<Student> students;

/* ...students list instantiated and populated somewhere along here... */

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

    @Override
    public int compare(Student student1, Student student2) {
        return student1.joinDate().compareTo(student2.joinDate());
    }
});

Я должен добавить, что если ваш список действительно объявлен как Object generic, вы 'собирается сделать много кастингов.Этот список должен быть объявлен как общий для Student, и у вас должны быть другие списки объектов, не предназначенных для учащихся.

1 голос
/ 23 декабря 2011

Вы можете сделать что-то следующим образом:

Либо заставить класс реализовать Comparable:

public class Student implements Comparable<Student> {
    private Date joinDate;
    private String id;

    //...

    @Override
    public int compareTo(Student o) {
        int result = joinDate.compareTo(o.joinDate);
        if(result != 0) {
            return result;
        }
        return id.compareTo(o.id);
    }    
}

Или использовать Comparator:

Comparator<Student> comparator = new Comparator<Student>() {

    @Override
    public int compare(Student o1, Student o2) {
        int result = o1.getJoinDate().compareTo(o2.getJoinDate());
        if (result != 0) {
            return result;
        }
        return o1.getId().compareTo(o1.getId());
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...