«Как вы будете сортировать коллекцию объектов сотрудников по идентификатору или имени». Для этого мы можем использовать два интерфейса, т. е. Comparator and Comparable.
кажется, это один из распространенных вопросов на собеседовании.
Но я не вижу причин, по которым я должен использовать оба для сортировки объектов сотрудников
Я думал о том, что comparator
делает, а Comparable
не может. Я понимаю, что если объекты (переменные экземпляра, которые сравниваются) имеют естественный порядок, то comparable
- правильный выбор. но если требуется пользовательский порядок (например, длина строки), то можно написать comparator.
моя точка зрения здесь comparator
нужна только клиенту, если он хочет отсортировать данные по каким-то другим критериям. Например, я бы реализовал Employee class
для сортировки по id
с помощью comparable interface
. но если клиент хочет отсортировать объекты Employee по String
(имя), он реализует comparator
либо как конкретный класс, либо анонимно при сортировке. Есть ли что-то, что мне здесь не хватает?
Например, в следующем коде для объекта Person мой метод compareTo сравнивает возраст и сортирует его. В методе сравнения я использую длину строки (имя человека) для сортировки. Теоретически я мог бы выполнить и то, и другое в методе compareTo, как я реализовал ниже.
наконец, есть ли какие-либо дополнительные преимущества одного из следующих по сравнению с другими. Я реализовал компаратор двумя способами: 1. как статический метод, который закомментирован 2. как анонимный объект (?) в основном методе, который закомментирован 3. make новый класс, который реализует компаратор и вызывает экземпляр этого класса в collections.sort() - этого я здесь не делал
(The commented-out parts of the code works. They are just different implementations)
mport java.util.Collections;
import java.util.Comparator;
import java.util.*;
public class PersonComparator implements Comparable{
private String name;
private int age;
public PersonComparator(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "name=" + name + ", age=" + age;
}
/*@Override
public int compareTo(Object obj) {
if (!(obj instanceof PersonComparator)) {
throw new ClassCastException("Invalid object");
}
PersonComparator p2 = (PersonComparator)obj;
return this.age-p2.age;
}*/
/*Alternative CompareTo that checks for both age and name*/
public int compareTo(Object obj) {
if (!(obj instanceof PersonComparator)) {
throw new ClassCastException("Invalid object");
}
PersonComparator p2 = (PersonComparator)obj;
if (this.age!=p2.age){
return this.age-p2.age;
}
else {
return (this.name.length()-p2.name.length());
}
}
/*public static Comparator nameLengthComparator
= new Comparator() {
@Override
public int compare(Object obj1, Object obj2) {
if (!(obj1 instanceof PersonComparator) || !(obj2 instanceof PersonComparator)){
throw new ClassCastException("Invalid object");
}
else {
PersonComparator p1 = (PersonComparator)obj1;
PersonComparator p2 = (PersonComparator)obj2;
return p1.name.length()-p2.name.length();
}
}
};*/
public static void main(String[] args){
PersonComparator p1 = new PersonComparator("Alexander", 45);
PersonComparator p2 = new PersonComparator("Pat", 27);
PersonComparator p3 = new PersonComparator("Zacky", 45);
PersonComparator p4 = new PersonComparator("Rake", 34);
List<PersonComparator> list = new ArrayList<PersonComparator>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
System.out.println("Before sorting "+ list);
Collections.sort(list);
//System.out.println("After sorting by age "+ list);
//System.out.println("Before sorting "+ list);
//Collections.sort(list, nameLengthComparator);
System.out.println("After sorting by name length "+ list);
/*Collections.sort(list, new Comparator<PersonComparator>() {
@Override
public int compare(PersonComparator p1, PersonComparator p2) {
return p1.name.length()-p2.name.length();
}
}
);*/
System.out.println("After sorting by name length "+ list);
}
}
Спасибо
Comparable<T>
с дженериками для обеспечения безопасности типов, а не используйтеObject
- person nachokk   schedule 31.08.2013