我发现的每个示例都是按字母顺序进行的,而我需要按日期对元素进行排序。
我的ArrayList包含其数据成员之一是DateTime对象的对象。在DateTime上,我可以调用以下函数:
lt() // less-than
lteq() // less-than-or-equal-to
因此,可以比较一下:
if(myList.get(i).lt(myList.get(j))){
// ...
}
我应该在if块内做什么?
我发现的每个示例都是按字母顺序进行的,而我需要按日期对元素进行排序。
我的ArrayList包含其数据成员之一是DateTime对象的对象。在DateTime上,我可以调用以下函数:
lt() // less-than
lteq() // less-than-or-equal-to
因此,可以比较一下:
if(myList.get(i).lt(myList.get(j))){
// ...
}
我应该在if块内做什么?
Answers:
您可以使对象具有可比性:
public static class MyObject implements Comparable<MyObject> {
private Date dateTime;
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date datetime) {
this.dateTime = datetime;
}
@Override
public int compareTo(MyObject o) {
return getDateTime().compareTo(o.getDateTime());
}
}
然后通过调用以下命令对其进行排序:
Collections.sort(myList);
但是,有时您不想更改模型,例如当您要对几个不同的属性进行排序时。在这种情况下,您可以动态创建比较器:
Collections.sort(myList, new Comparator<MyObject>() {
public int compare(MyObject o1, MyObject o2) {
return o1.getDateTime().compareTo(o2.getDateTime());
}
});
但是,仅当您确定比较时dateTime不为null时,以上方法才有效。明智的是,还应处理null以避免NullPointerExceptions:
public static class MyObject implements Comparable<MyObject> {
private Date dateTime;
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date datetime) {
this.dateTime = datetime;
}
@Override
public int compareTo(MyObject o) {
if (getDateTime() == null || o.getDateTime() == null)
return 0;
return getDateTime().compareTo(o.getDateTime());
}
}
或在第二个示例中:
Collections.sort(myList, new Comparator<MyObject>() {
public int compare(MyObject o1, MyObject o2) {
if (o1.getDateTime() == null || o2.getDateTime() == null)
return 0;
return o1.getDateTime().compareTo(o2.getDateTime());
}
});
从Java 8开始,List接口提供了sort方法。结合lambda表达式,最简单的解决方案是
// sort DateTime typed list
list.sort((d1,d2) -> d1.compareTo(d2));
// or an object which has an DateTime attribute
list.sort((o1,o2) -> o1.getDateTime().compareTo(o2.getDateTime()));
// or like mentioned by Tunaki
list.sort(Comparator.comparing(o -> o.getDateTime()));
反向排序
Java 8还提供了一些方便的反向排序方法。
//requested by lily
list.sort(Comparator.comparing(o -> o.getDateTime()).reversed());
list.sort(Comparator.comparing(o -> o.getDateTime()));
list.sort(Comparator.comparing(MyObject::getDateTime)
您可以使用Collections.sort方法。这是一种静态方法。您将列表和比较器传递给它。它在列表上使用了经过修改的mergesort算法。这就是为什么必须将其传递给比较器进行配对比较的原因。
Collections.sort(myList, new Comparator<MyObject> {
public int compare(MyObject o1, MyObject o2) {
DateTime a = o1.getDateTime();
DateTime b = o2.getDateTime();
if (a.lt(b))
return -1;
else if (a.lteq(b)) // it's equals
return 0;
else
return 1;
}
});
请注意,如果myList具有可比较的类型(实现Comparable接口的类型)(例如Date,Integer或String),则可以省略比较器,并使用自然顺序。
这是我解决的方法:
Collections.sort(MyList, (o1, o2) -> o1.getLastModified().compareTo(o2.getLastModified()));
希望对您有帮助。
随着Java 1.8的引入,流对于解决此类问题非常有用:
Comparator <DateTime> myComparator = (arg1, arg2)
-> {
if(arg1.lt(arg2))
return -1;
else if (arg1.lteq(arg2))
return 0;
else
return 1;
};
ArrayList<DateTime> sortedList = myList
.stream()
.sorted(myComparator)
.collect(Collectors.toCollection(ArrayList::new));
我发现这里的所有答案对于一个简单的问题来说都是不必要的复杂(至少对于有经验的Java开发人员而言,我不是)。我遇到了类似的问题,并且偶然发现了这个(和其他)解决方案,尽管它们提供了一个指针,但对于我发现的上述初学者来说,却是如此。我的解决方案取决于日期在对象中的位置,在这种情况下,日期是Object []的第一个元素,其中dataVector是包含对象的ArrayList。
Collections.sort(dataVector, new Comparator<Object[]>() {
public int compare(Object[] o1, Object[] o2) {
return ((Date)o1[0]).compareTo(((Date)o2[0]));
}
});
DateTime
包含在另一个对象内的对象的描述有关。如果只有一个Date
或没有DateTime
对象,则一Comparable
开始就不需要Comparator
。
这可能是一个旧的响应,但是我使用了本文中的一些示例来创建一个比较器,该比较器将按列表ArrayList
中HashMap<String, String>
的一个对象(即时间戳)对of 进行排序。
我有这些对象:
ArrayList<Map<String, String>> alList = new ArrayList<Map<String, String>>();
地图对象如下:
Map<String, Object> map = new HashMap<>();
// of course this is the actual formatted date below in the timestamp
map.put("timestamp", "MM/dd/yyyy HH:mm:ss");
map.put("item1", "my text goes here");
map.put("item2", "my text goes here");
该映射是我使用该alList.add(map)
函数在循环内将所有对象加载到数组列表中的方式。
现在,我创建了自己的比较器:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
public class DateSorter implements Comparator {
public int compare(Object firstObjToCompare, Object secondObjToCompare) {
String firstDateString = ((HashMap<String, String>) firstObjToCompare).get("timestamp");
String secondDateString = ((HashMap<String, String>) secondObjToCompare).get("timestamp");
if (secondDateString == null || firstDateString == null) {
return 0;
}
// Convert to Dates
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
DateTime firstDate = dtf.parseDateTime(firstDateString);
DateTime secondDate = dtf.parseDateTime(secondDateString);
if (firstDate.isAfter(secondDate)) return -1;
else if (firstDate.isBefore(secondDate)) return 1;
else return 0;
}
}
现在,我可以随时在数组上随时调用Comparator,它将对数组进行排序,为我提供位置0(列表顶部)的最新时间戳,以及列表末尾的最早时间戳。新帖子基本上排在顶部。
Collections.sort(alList, new DateSorter());
这可能会帮助某人,这就是我发布它的原因。考虑compare()函数中的return语句。有3种类型的结果。如果它们相等,则返回0;如果第一个日期在第二个日期之前,则返回> 0;如果第一个日期在第二个日期之后,则返回<0。如果您希望您的列表被颠倒,那么只需切换这两个return语句即可!简单=]
使用以下方法确定日期是否已排序
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
boolean decendingOrder = true;
for(int index=0;index<date.size() - 1; index++) {
if(simpleDateFormat.parse(date.get(index)).getTime() < simpleDateFormat.parse(date.get(index+1)).getTime()) {
decendingOrder = false;
break;
}
}
if(decendingOrder) {
System.out.println("Date are in Decending Order");
}else {
System.out.println("Date not in Decending Order");
}
}
SimpleDateFormat
课程。至少不是第一选择。也并非毫无保留。今天,我们java.time
在现代Java日期和时间API及其功能方面有了很多改进DateTimeFormatter
。
Date类已经实现了Comparator接口。假设您有以下课程:
public class A {
private Date dateTime;
public Date getDateTime() {
return dateTime;
}
.... other variables
}
假设您有一个A对象的列表,例如List<A> aList
,您可以使用Java 8的流API轻松对其进行排序(下面的代码段):
import java.util.Comparator;
import java.util.stream.Collectors;
...
aList = aList.stream()
.sorted(Comparator.comparing(A::getDateTime))
.collect(Collectors.toList())
未来的观众,我认为这是最简单的解决方案,如果您的模型包含日期类型的字符串(例如“ 2020-01-01 10:00:00”),则只需编写以下行,即可按日期从最新到最旧:
Collections.sort(messages, (o1, o2) -> o2.getMessageDate().compareTo(o1.getMessageDate()));