Сортиране на ArrayList‹class› в 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>

защото няма да има фиксиран размер. Когато искам да сортирам този arraylist по фамилия, какво да правя?


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› контакти = нов ArrayList‹›(); (Контактът е клас с много полета) по фамилията на полето на контакта (низ).. Така че ще напиша: Collections.sort(contacts, new Comparator‹???????›) .. Моля, помогнете ми за кода .. Срещам този проблем много пъти и искам решение.. - person Bbabis; 23.11.2012