按date排列ArrayList中的对象?

有人可以帮我弄这个吗? 我find的每个例子都是按字母顺序做的,而我需要按datesorting的元素。

我的ArrayList包含其中一个数据成员是DateTime对象的对象。 在date时间,我可以调用函数:

lt() // less-than lteq() // less-than-or-equal-to 

所以比较我可以做一些事情:

 if(myList.get(i).lt(myList.get(j))){ // ... } 

我真的不知道如何在if块内做什么。 有任何想法吗?

你可以让你的对象具有可比性:

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

但是有时你不想改变你的模型,比如当你想对几个不同的属性进行sorting时。 在这种情况下,您可以即时创build比较器:

 Collections.sort(myList, new Comparator<MyObject>() { public int compare(MyObject o1, MyObject o2) { return o1.getDateTime().compareTo(o2.getDateTime()); } }); 

但是,只有在确定dateTime在比较时不为空的情况下,上述方法才有效。 处理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()); } }); 

你可以使用Collections.sort方法。 这是一个静态的方法。 你把它传递给列表和一个比较器。 它在列表上使用修改后的mergesortalgorithm。 这就是为什么你必须通过一个比较器来做比较。

 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是可比较types(实现Comparable接口的types)(如Date,Integer或String),则可以省略比较器,并使用自然sorting。

自Java 8以来, List接口提供了sorting方法。 结合lambdaexpression式,最简单的解决scheme就是

 // 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())) 

给定具有带有getDateTime()方法的DateTime成员的MyObject ,可以通过DateTime对象对包含MyObject元素的ArrayList进行sorting,如下所示:

 Collections.sort(myList, new Comparator<MyObject>() { public int compare(MyObject o1, MyObject o2) { return o1.getDateTime().lt(o2.getDateTime()) ? -1 : 1; } }); 
 list.sort(Comparator.comparing(o -> o.getDateTime())); 

从Tunaki使用Java 8 lambda的最佳答案恕我直言

我发现这里的所有答案对于一个简单的问题来说都是非常复杂的(至less对于一个有经验的java开发人员来说,我并不是这样)。 我有一个类似的问题,偶然发现这个(和其他)的解决scheme,虽然他们提供了一个指针,我觉得如上所述的初学者。 我的解决scheme取决于你的date对象的位置,在这种情况下,date是Object []的第一个元素,其中dataVector是包含对象的ArrayList。

 Collections.sort(dataVector, new Comparator<Object[]>() { public int compare(Object[] o1, Object[] o2) { return ((Date)o1[0]).compareTo(((Date)o2[0])); } }); 

随着Java 1.8的推出,stream在解决这类问题时非常有用:

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

这是我解决的方法:

 Collections.sort(MyList, (o1, o2) -> o1.getLastModified().compareTo(o2.getLastModified())); 

希望它能帮助你。

DateTime.compare ?

这可能是一个旧的响应,但我用这个post中的一些例子来创build一个比较器,它将HashMap<String, String>的一个对象(即时间戳)对HashMap<String, String>ArrayList进行sorting。

我有这些对象:

 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)函数,在一个循环内。

现在,我创build了自己的比较器:

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

我现在可以随时在数组上调用比较器,它会对我的数组进行sorting,给我在位置0(列表顶部)的最新时间戳和列表末尾的最早时间戳。 新的post基本上得到了顶部。

 Collections.sort(alList, new DateSorter()); 

这可能会帮助别人,这就是为什么我发布它。 考虑compare()函数中的返回语句。 有三种types的结果。 如果相等则返回0,如果第一个date在第二个date之前返回> 0,如果第一个date在第二个date之后返回<0。 如果你希望你的列表被颠倒过来,那么只要切换这两个返回语句! 简单=]

在参数中传递ArrayList。

  private static void order(ArrayList<Object> list) { Collections.sort(list, new Comparator() { public int compare(Object o2, Object o1) { String x1 = o1.Date; String x2 = o2.Date; return x1.compareTo(x2); } }); }