Различные коллекции для различной сортировки данных - PullRequest
0 голосов
/ 24 октября 2010

У меня есть задача поиграть с фреймворком Java Collections.Мне нужно получить список пользователей из базы данных и сохранить его в коллекции.(Это закончено, и пользователи хранятся в HashSet).Каждый пользователь - это экземпляр класса Person, описанный именем, фамилией, датой рождения, датой присоединения и некоторыми другими параметрами, которые в настоящее время не важны.Далее мне нужно сохранить список в разных коллекциях (нигде не указано, сколько), предоставляя функции для их сортировки:
- только имя
- имя, фамилия, дата рождения
- дата присоединения

Хорошо, для начала, мой Персона хранит данные только в виде Строк (нужно ли менять даты на Дату?).Я начал осуществлять сортировку с помощью «по имени, фамилии, дате рождения», потому что это то, что я получаю после вызова sort в списке со строками.Я прав?

public List createListByName(Set set){
    List ret = new ArrayList<String>();
    String data = "";

    for(Object p: set){
        data = p + "\n";
        ret.add(data);
    }
    Collections.sort(ret);
    return ret;
}

Но что с остальными?Вот мой Person:

class Person {

    private String firstname;
    private String lastname;
    )..)


    Person(String name, String surname, (..)){
        firstname = name;
        lastname = surname;
        (..)
    }

    @Override
    public String toString(){
        return firstname + " " + lastname + " " + (..);
    }
}

Ответы [ 2 ]

2 голосов
/ 24 октября 2010

Я бы не стал конвертировать все в строки для начала.Я бы реализовал Comparator<Person>, а затем отсортировал List<Person>:

public List<Person> createListByName(Set<Person> set){
    List<Person> ret = new ArrayList<Person>(set);
    Collections.sort(ret, new NameSurnameBirthComparator());
    return ret;
}

. NameSurnameBirthComparator реализовал бы Comparator<Person> и сравнил бы двух людей, сначала сравнив их имена, затем их фамилии (если ихимена равны), тогда даты их рождения (если их фамилии равны).

Примерно так:

public int compare(Person p1, Person p2) {
    // TODO: Consider null checks, and what to do :)
    int firstNameResult = p1.getFirstName().compareTo(p2.getFirstName());
    if (firstNameResult != 0) {
        return firstNameResult;
    }
    int surnameResult = p1.getSurname().compareTo(p2.getSurname());
    if (surnameResult != 0) {
        return surnameResult;
    }
    return p1.getBirthDate().compareTo(p2.getBirthDate());
}

И да, я будет хранить датурождение как Date - или предпочтительно как LocalDate из JodaTime , поскольку это гораздо более приятная библиотека для манипулирования датой и временем:)

0 голосов
/ 24 октября 2010

поэтому я должен написать несколько компиляторов для Person для каждой задачи?

Учитывая, что это домашнее задание, я бы сказал, что именно так вы начнете изучать Comparators.

Только для интереса вы можете сделать это, создав пару сопоставимых компараторов.

Вы можете использовать Bean Comparator для сортировки по отдельным свойствам.

Затем вы можете использовать Групповой компаратор для сортировки по нескольким свойствам.

...