Сортировка Arraylist Custom объекта по дате создания

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

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

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

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

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


person kaibuki    schedule 09.01.2012    source источник
comment
Покажите нам, что вы пробовали, и объясните, почему вы храните даты как строки, а не как даты.   -  person JB Nizet    schedule 09.01.2012
comment
можешь показать то, что уже пробовал ...   -  person Anantha Sharma    schedule 09.01.2012
comment
используйте даты как даты, а не строку или еще лучше, измените свой объект и добавьте другое значение (если возможно, полученное из данных / времени), по которому вы можете выполнить сортировку   -  person Johnydep    schedule 09.01.2012
comment
в значительной степени дублирует http://stackoverflow.com/questions/3342517/sorting-arraylist-of-objects-by-object-attribute   -  person Jakob Weisblat    schedule 09.01.2012


Ответы (8)


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

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;
                    }
                });
person kaibuki    schedule 10.01.2012

Вы должны использовать _ 1_ и реализовать компаратор, например

Comparator c = new Comparator<YourObject>() {
    public int compare(YourObject o1, YourObject o2) {
       return o1.createdOn.compareTo(o2.createdOn);
    }
}
person Kai    schedule 09.01.2012

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

person npinti    schedule 09.01.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);

С другой стороны, реализуя компаратор, вы можете указать критерии упорядочения вне кода настраиваемого объекта. Используя соответствующий 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());
person frm    schedule 09.01.2012

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

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

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

person Peter Lawrey    schedule 09.01.2012

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

new Comparator<CustomObject>() {
    public int compare(CustomObject o1, CustomObject o2) {
       //compare by date 
       return <-1 or 0 or 1>;
    }
}
person yatskevich    schedule 09.01.2012

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

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

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

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

person AlexR    schedule 09.01.2012

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

person Jakob Weisblat    schedule 09.01.2012