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