0

我有一个自定义对象,其结构是

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

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

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

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

4

8 回答 8

6

得到答案后做了一些研发,我解决了排序的问题,这里是按日期对数组列表进行排序的代码。

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;
                    }
                });
于 2012-01-10T07:38:12.837 回答
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);
    }
}
于 2012-01-09T14:17:49.383 回答
2

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

于 2012-01-09T14:17:53.073 回答
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);

另一方面,实现一个比较器,您可以在自定义对象的代码之外指定一个排序标准。使用适当的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());
于 2012-01-09T14:34:26.513 回答
0

对于自定义对象,您需要自定义比较器,或者您需要使类具有可比性。

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

正如已经建议的那样,将日期存储为 Date 或 long 可能是更好的选择。

于 2012-01-09T14:16:26.877 回答
0

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

new Comparator<CustomObject>() {
    public int compare(CustomObject o1, CustomObject o2) {
       //compare by date 
       return <-1 or 0 or 1>;
    }
}
于 2012-01-09T14:17:23.017 回答
0

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

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

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

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

于 2012-01-09T14:19:11.393 回答
0

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

于 2012-01-09T14:20:14.083 回答