Ваш вопрос немного расплывчатый, но если единственная цель состоит в том, чтобы использовать разные алгоритмы сортировки в зависимости от того, какое свойство вы хотите использовать, то лучше использовать Comparator
.
public class Person {
private String name;
private int age;
public static Comparator COMPARE_BY_NAME = new Comparator<Person>() {
public int compare(Person one, Person other) {
return one.name.compareTo(other.name);
}
}
public static Comparator COMPARE_BY_AGE = new Comparator<Person>() {
public int compare(Person one, Person other) {
return one.age > other.age ? 1
: one.age < other.age ? -1
: 0; // Maybe compare by name here? I.e. if same age, then order by name instead.
}
}
// Add/generate getters/setters/equals()/hashCode()/toString()
}
, который вы можете использовать следующим образом:
List<Person> persons = createItSomehow();
Collections.sort(persons, Person.COMPARE_BY_NAME);
System.out.println(persons); // Ordered by name.
Collections.sort(persons, Person.COMPARE_BY_AGE);
System.out.println(persons); // Ordered by age.
Что касается фактической реализации equals()
, я бы предпочел, чтобы она возвращала значение true, когда оба объекта Person
технически или естественно идентичны. Для этого вы можете использовать любой сгенерированный БД ПК для сравнения по технической идентичности:
public class Person {
private Long id;
public boolean equals(Object object) {
return (object instanceof Person) && (id != null)
? id.equals(((Person) object).id)
: (object == this);
}
}
или просто сравните каждое свойство для сравнения по естественной идентичности:
public class Person {
private String name;
private int age;
public boolean equals(Object object) {
// Basic checks.
if (object == this) return true;
if (object == null || getClass() != object.getClass()) return false;
// Property checks.
Person other = (Person) object;
if (name == null ? other.name != null : !name.equals(other.name)) return false;
if (age != other.age) return false;
// All passed.
return true;
}
}
Не забудьте также переопределить hashCode()
при переопределении equals()
.
Смотри также: