воскресенье, 14 февраля 2010 г.

Comparable & Comparator

Сегодня мы поговорим о сравнениях. Они нужны в первую очередь, для сортировки.
Например в доменной модели есть User (POJO))

public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}

И мы на сайте выводим их в алфавитном порядке.
Как же их отсортировать-то?
Можно создать массив, поместить туда пользователей и написав сортировку пузырьком отсортировать их.
Что же делать, если писать сортировку нет охоты? Можно воспользоваться стандартными средствами.
class UserService{
static List users;
static List getUsers(){
return users;
}
}

class SomeController{
void foo(){
Collections.sort(UserService.getUsers());
}
}

Но как же компьютер отсортирует пользователей, как он узнает критерии сравнения? Надо ему о них рассказать.
Для этого изменим класс User
public class User implements Comparable<User>{
private String name;
private int age;
//...
@Override
public int compareTo(User o) {
return name.compareTo(o.name);
}
}

compareTo() возвращает отрицательное число если текущий объект должен идти раньше, чем тот с чем сравнивают.

Все хорошо проект сделан. Но вот не задача, пришел заказчик и хочет, дабы мы еще сделали сортировку по возрасту. А не послать ли нам его? – хорошая идея, но, скорее всего, придется таки делать.
Для этого есть механизм “сравнителей”.
Например,
class CompareByAge implements Comparator<User>{
@Override
public int compare(User u1, User u2) {
return u1.getAge() - u2.getAge();
}
}

Сортировка с его использованием будет выглядеть как
 void bar(){
Collections.sort(UserService.getUsers(), new CompareByAge());
}

Преимущество такого подхода в том, что может существовать сколь угодно компараторов.
Отметим, даты, строки и многих другие класс реализуют интерфейс Comparable, поэтому мы можем сортировать их без дополнительных сложностей.

Пробуйте!

(Статья подготовлена совместно compiler & Link)

Комментариев нет:

Отправить комментарий