Сортировка ArrayList‹класс› в Java

У меня есть этот класс:

public class Contact {
private  String firstname;
private String lastname;
private List<Integer> phoneNumber;
private Scanner in;
public Contact(){
    phoneNumber = new ArrayList<>();
    firstname = lastname = "";
    in = new Scanner(System.in);
}
public void setFirstName(){
    firstname = in.nextLine();
} 
public  void setLastName(){
    lastname = in.nextLine();
}
public void setPhoneNumber(){
    phoneNumber.add(in.nextInt());
}
public String getFirstName(){
    return firstname;
}
public  String getLastName(){
    return lastname;
}
public  Integer getPhoneNumber(int position){
    return phoneNumber.get(position);
}
}

Теперь я хочу сделать телефонную книгу класса, в которой есть мои контакты. Я подумал сделать это с помощью

Arraylist<Contact>

потому что у него не будет фиксированного размера. Когда я хочу отсортировать этот массив по фамилии, что мне делать?


person Bbabis    schedule 23.11.2012    source источник
comment
Этот вопрос уже задавали много раз, и его легко найти в Интернете. stackoverflow.com/questions/9679769/   -  person Ben Thurley    schedule 23.11.2012


Ответы (2)


Ваш класс Contact должен реализовать интерфейс Comparable... Затем вы можете использовать Collections.sort(list) для сортировки списка.

Изменить: если вы хотите иметь несколько способов сортировки, вы также можете создать класс, реализующий интерфейс Comparator. Вы можете создать несколько компараторов (или сделать один настраиваемым), затем вы можете передать компаратор в качестве второго параметра в Collections.sort

Вот ссылка, объясняющая решение компаратора: http://www.vogella.com/blog/2009/08/04/collections-sort-java/

person Tom    schedule 23.11.2012
comment
Я не могу заставить класс MyComparable реализовывать Comparator‹String›. Вы можете помочь мне? Как мне сравнить 2 фамилии контактов и вернуть правильный? После: Collections.sort(contacts, new MyComparable()); ? - person Bbabis; 23.11.2012
comment
Пусть ваш класс MyComparable реализует Comparator‹Contact› вместо Comparator‹String›, так как вы хотите сравнить элементы контактов... - person Tom; 23.11.2012

Вам нужно будет добавить собственный компаратор для фамилии либо как отдельный класс, либо как анонимный класс:

Хорошо, я редактирую, так как у меня есть свободное время, и я думаю, вы изучаете Java :)

Добавьте эти два метода в класс Contact для тестирования:

public void setLastName(String lastname) {
    this.lastname = lastname;
}
@Override
public String toString() {
    return getLastName();
}

Тестовое задание:

public class Sort {

    static List<Contact> list = new ArrayList<Contact>();
    static Contact one = new Contact(); 
    static Contact two = new Contact(); 
    static Contact three = new Contact(); 
    public static void main(String[] args) {
        one.setLastName("Smith");
        two.setLastName("Monks");
        three.setLastName("Aaron");
        list.add(one); list.add(two); list.add(three);
        System.out.println("Before: " + list);
        Collections.sort(list, new Comparator<Contact>() {
            public int compare(Contact contact, Contact another) {
                return contact.getLastName().compareToIgnoreCase(another.getLastName());
            }
        });
        System.out.println("After: " + list);
    }
}

Ваш результат должен быть:

Before: [Smith, Monks, Aaron]
After: [Aaron, Monks, Smith]
person Akber Choudhry    schedule 23.11.2012
comment
Я хочу отсортировать контакты ArrayList‹Contact› = new ArrayList‹›(); (Контакт - это класс со многими полями) по имени поля контакта (строка).. Итак, я напишу: Collections.sort (контакты, новый компаратор‹???????›) .. Пожалуйста, помогите мне с кодом .. Я сталкиваюсь с этой проблемой много раз, и мне нужно решение.. - person Bbabis; 23.11.2012