按创建日期排序自定义对象的Arraylist

时间:2012-01-09 14:13:06

标签: java datetime sorting arraylist custom-object

我有一个结构为

的自定义对象
public String name;
public int type;
public String createdOn;

createdOn是日期,格式为:2011-12-16T23:27:27+0000

我在ArrayList中存储了多个此类型的对象,现在我想根据创建日期和时间对它们进行排序。

我尝试使用Collections.sort(....),但没有合适的结果。

8 个答案:

答案 0 :(得分:6)

在得到答案后做一些R& D,我解决了排序的问题,这里是按日期排序数组列表的代码。

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;
                    }
                });

答案 1 :(得分:3)

你必须使用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 :(得分:2)

您需要创建自己的自定义Comparator(看看here)。您很可能必须将字符串解析回日期。看看this之前的SO帖子,看看如何比较日期。

答案 3 :(得分:1)

您应该在自定义对象中使用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());

答案 4 :(得分:0)

对于Custom对象,您需要一个自定义Comparator,或者您需要使该类具有可比性。

您可以每次转换日期字符串,也可以只比较字符串(假设时区不变)

正如所建议的那样,将日期存储为日期或长期可能是更好的选择。

答案 5 :(得分:0)

您是否尝试过实施自定义Comparator

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

答案 6 :(得分:0)

您的类应该实现接口Comparable。在这种情况下,您可以根据需要实施compareTo()方法。

或者,您可以实现自定义比较器:

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

现在使用接受自定义比较器的Collections.sort()版本。如果您的比较器很简单,您可以使用匿名内部类。

答案 7 :(得分:0)

按照here的说明操作,只需使用Date类中的方法来比较日期