Сортировать ArrayList пользовательских объектов по свойству - PullRequest
1067 голосов
/ 07 мая 2010

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

Я хотел отсортировать ArrayList пользовательских объектов по одному из их свойств: объекту 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);
    ...
}

Ответы [ 25 ]

2 голосов
/ 07 мая 2010

ваш класс customComparator должен реализовывать java.util.Comparator, чтобы его можно было использовать. он также должен переоценивать сравнение () И равно ()

compare () должен ответить на вопрос: объект 1 меньше, равен или больше объекта 2?

полные документы: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html

2 голосов
/ 26 сентября 2015

С этой библиотекой здесь вы можете отсортировать список пользовательских объектов по нескольким столбцам. Библиотека использует функции версии 8.0. Образец также доступен там. Вот образец, чтобы сделать

SortKeys sortKeys = new SortKeys();
sortKeys.addField("firstName")
            .addField("age", true); // This (true) will sort the age descending

// Other ways to specify a property to the sorter are
//      .addField("lastName", String.class);
//      .addField("dob", Date.class, true);

// Instantiate a ListSorter
ListSorter listSorter = new ListSorter();

// Pass the data to sort (listToSort) and the "by keys" to sort (sortKeys)
List sortedList = (List<Person>) listSorter.sortList(listToSort, sortKeys);
1 голос
/ 07 мая 2010

Я предпочитаю этот процесс:

public class SortUtil
{    
    public static <T> List<T> sort(List<T> list, String sortByProperty)
    {
            Collections.sort(list, new BeanComparator(sortByProperty));
            return list;
    }
}

List<T> sortedList = SortUtil<T>.sort(unsortedList, "startDate");

Если в вашем списке объектов есть свойство с именем startDate, вы вызываете его снова и снова. Вы можете даже связать их startDate.time.

Это требует, чтобы ваш объект был Comparable, что означает, что вам нужна реализация compareTo, equals и hashCode.

Да, это может быть быстрее ... Но теперь вам не нужно создавать новый компаратор для каждого типа сортировки. Если вы можете сэкономить на времени разработки и отказаться от времени выполнения, вы можете пойти с этим.

0 голосов
/ 28 декабря 2018

Ваш пользовательский класс может реализовывать интерфейс "Comparable", который требует реализации метода CompareTo. В методе CompareTo вы можете определить, что означает, что объект на меньше или больше другого объекта. Так что в вашем примере это может выглядеть примерно так:

public class MyCustomClass implements Comparable<MyCustomClass>{

..........

 @Override
public int compareTo(MyCustomClass a) {
    if(this.getStartDate().before(a.getStartDate())){
        return -1;
    }else if(a.getStartDate().before(this.getStartDate())){
        return 1;
    }else {
        return 0;
    }
}

Отрицательное число указывает, что это меньше, чем сравниваемый объект. Положительное число указывает, что это больше, чем по сравнению с объектом, а ноль означает, что объекты равны.

Затем вы можете использовать collection.sort (myList), чтобы отсортировать список без подачи в компаратор. Этот метод также имеет преимущество в том, что вещи сортируются автоматически, если вы используете структуры данных отсортированной коллекции, например TreeSet или TreeMap.

Вы можете проверить эту статью, если хотите больше узнать об интерфейсе Comparable (раскрытие: я автор;)) https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/

0 голосов
/ 21 марта 2018

Использование Java 8 позволяет определить Comparator в одну строку, используя Comparator.comparing()

Используйте любой из следующих способов:

Вариант 1:

listToBeSorted.sort(Comparator.comparing(CustomObject::getStartDate));

Вариант 2:

Collections.sort(listToBeSorted, Comparator.comparing(CustomObject::getStartDate));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...