Сортировка Arraylist объекта Custom по дате создания - PullRequest
0 голосов
/ 09 января 2012

У меня есть пользовательский объект, структура которого

public String name;
public int type;
public String createdOn;

createdOn - это дата, а его формат: 2011-12-16T23:27:27+0000

Я сохранил несколько объектов этого типа в ArrayList и теперь я хочу отсортировать их по дате и времени создания.

Я пытался использовать Collections.sort(....), но без подходящего результата.

Ответы [ 8 ]

6 голосов
/ 10 января 2012

Проведя некоторые исследования и разработки после получения ответов, я решил проблему с сортировкой, вот код для сортировки списка массивов по дате.

Collections.sort(arrlst,new Comparator<T>() {

                    public int compare(T lhs, T rhs) {

                        try {
                            SimpleDateFormat dateFormatlhs = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
                            Date convertedDatelhs = dateFormatlhs.parse(lhs.feedCreatedTime);
                            Calendar calendarlhs = Calendar.getInstance();
                            calendarlhs.setTime(convertedDatelhs);

                            SimpleDateFormat dateFormatrhs = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
                            Date convertedDaterhs = dateFormatrhs.parse(rhs.feedCreatedTime);
                            Calendar calendarrhs = Calendar.getInstance();
                            calendarrhs.setTime(convertedDaterhs);

                            if(calendarlhs.getTimeInMillis() > calendarrhs.getTimeInMillis())
                            {   


                                return -1;
                            }
                            else
                            {


                                return 1;

                            }
                        } catch (ParseException e) {

                            e.printStackTrace();
                        }


                        return 0;
                    }
                });
3 голосов
/ 09 января 2012

Вы должны использовать Collections.sort(List<T> list, Comparator<? super T> c) и реализовать компаратор, подобный

Comparator c = new Comparator<YourObject>() {
    public int compare(YourObject o1, YourObject o2) {
       return o1.createdOn.compareTo(o2.createdOn);
    }
}
2 голосов
/ 09 января 2012

Вам нужно будет создать свой собственный Компаратор (посмотрите здесь ).Скорее всего, вам придется анализировать строки обратно к датам.Взгляните на этот предыдущий пост SO, чтобы увидеть, как можно сравнивать даты.

1 голос
/ 09 января 2012

Вы должны использовать Comparator или реализовать Comparable в своем пользовательском объекте.

Реализуя Comparable, вы определяете естественный порядок для ваших объектов.В методе Comparable.compareTo () необходимо сравнить текущий объект с другим и вернуть

  • отрицательное целое число, если текущий объект "меньше" другого объекта;
  • ноль, если текущий объект «равен» другому;
  • положительное целое число, если текущий объект «больше» другого.

Пример:

public class CustomObject implements Comparable<CustomObject> {

    @Override
    public int compareTo(CustomObject otherOne) {
        // Compare the current object with the otherOne and return an
        // appropriate integer
        return 0;
    }

}

// To sort

Collections.sort(listOfCustomObjects);

С другой стороны, реализуя Comparator, вы можете указать критерии упорядочения вне кода пользовательского объекта.Используя соответствующий метод Collections.sort () , вы можете указать порядок объектов в коллекции.Метод Comparator.compare () следует тем же правилам, которые описаны выше.

Пример:

public class CustomObjectComparator implements Comparator<CustomObject> {

    @Override
    public int compare(CustomObject a, CustomObject b) {
        // Compare a with b and return an appropriate integer
        return 0;
    }

}

// To sort

Collections.sort(list, new CustomObjectComparator());
0 голосов
/ 09 января 2012

Следуйте инструкциям здесь , просто используйте метод из класса Date для сравнения дат

0 голосов
/ 09 января 2012

Ваш класс должен реализовывать интерфейс Comparable. В этом случае вы можете реализовать метод compareTo() в соответствии с вашими потребностями.

В качестве альтернативы вы можете реализовать свой собственный компаратор:

class MyCreationDateComparator implements Comparator<MyClass> {
    public int compare(MyClass o1, MyClass o2) {
        // implement your logic here.
    } 
}

Теперь используйте версию Collections.sort(), которая принимает пользовательский компаратор. Если ваш компаратор прост, вы можете использовать анонимный внутренний класс.

0 голосов
/ 09 января 2012

Вы пытались реализовать свой пользовательский Comparator?

new Comparator<CustomObject>() {
    public int compare(CustomObject o1, CustomObject o2) {
       //compare by date 
       return <-1 or 0 or 1>;
    }
}
0 голосов
/ 09 января 2012

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

Вы можете конвертировать строку даты каждый раз или просто сравнивать строки (при условии, что часовой пояс не меняется)

Как уже было предложено, хранение дат в качестве даты или длинного, вероятно, будет лучшим выбором.

...