我有一个结构为
的自定义对象public String name;
public int type;
public String createdOn;
createdOn
是日期,格式为:2011-12-16T23:27:27+0000
我在ArrayList
中存储了多个此类型的对象,现在我想根据创建日期和时间对它们进行排序。
我尝试使用Collections.sort(....)
,但没有合适的结果。
答案 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类中的方法来比较日期