Вопрос-ответ

Sort ArrayList of custom Objects by property

Сортировка массива пользовательских объектов по свойству

Я читал о сортировке списков массивов с использованием компаратора, но во всех примерах люди использовали compareTo который, согласно некоторым исследованиям, является методом для строк.

Я хотел отсортировать массив пользовательских объектов по одному из их свойств: объекту Date (getStartDay()). Обычно я сравниваю их по item1.getStartDate().before(item2.getStartDate()) поэтому мне было интересно, могу ли я написать что-то вроде:

public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}

public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
Переведено автоматически
Ответ 1

Поскольку Date реализует Comparable, у него есть compareTo метод, точно такой же, как у String.

Итак, ваш пользовательский Comparator может выглядеть следующим образом:

public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}

compare() Метод должен возвращать int, поэтому вы не смогли бы вернуть a напрямую, boolean как вы планировали в любом случае.

Ваш код сортировки будет примерно таким, как вы написали:

Collections.sort(Database.arrayList, new CustomComparator());

Немного более короткий способ записать все это, если вам не нужно повторно использовать ваш компаратор, - записать его как встроенный анонимный класс:

Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});

Начиная с

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

Collections.sort(Database.arrayList, 
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

И List имеет sort(Comparator) метод, так что вы можете сократить это еще больше:

Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

Это настолько распространенная идиома, что существует встроенный метод для генерации Comparator для класса с Comparable ключом:

Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));

Все это эквивалентные формы.

Ответ 2

Classes that has a natural sort order (a class Number, as an example) should implement the Comparable interface, whilst classes that has no natural sort order (a class Chair, as an example) should be provided with a Comparator (or an anonymous Comparator class).

Two examples:

public class Number implements Comparable<Number> {
private int value;

public Number(int value) { this.value = value; }
public int compareTo(Number anotherInstance) {
return this.value - anotherInstance.value;
}
}

public class Chair {
private int weight;
private int height;

public Chair(int weight, int height) {
this.weight = weight;
this.height = height;
}
/* Omitting getters and setters */
}
class ChairWeightComparator implements Comparator<Chair> {
public int compare(Chair chair1, Chair chair2) {
return chair1.getWeight() - chair2.getWeight();
}
}
class ChairHeightComparator implements Comparator<Chair> {
public int compare(Chair chair1, Chair chair2) {
return chair1.getHeight() - chair2.getHeight();
}
}

Usage:

List<Number> numbers = new ArrayList<Number>();
...
Collections.sort(numbers);

List<Chair> chairs = new ArrayList<Chair>();
// Sort by weight:
Collections.sort(chairs, new ChairWeightComparator());
// Sort by height:
Collections.sort(chairs, new ChairHeightComparator());

// You can also create anonymous comparators;
// Sort by color:
Collections.sort(chairs, new Comparator<Chair>() {
public int compare(Chair chair1, Chair chair2) {
...
}
});
Ответ 3

Для сортировки ArrayList вы могли бы использовать следующий фрагмент кода:

Collections.sort(studList, new Comparator<Student>(){
public int compare(Student s1, Student s2) {
return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
}
});
Ответ 4

JAVA 8 лямбда-выражение

Collections.sort(studList, (Student s1, Student s2) ->{
return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
});

или

Comparator<Student> c = (s1, s2) -> s1.firstName.compareTo(s2.firstName);
studList.sort(c)
java date