按日期排序ArrayList中的对象?

按日期排序ArrayList中的对象?

我找到的每一个例子都是按字母顺序进行的,而我需要按日期排序元素。

我的ArrayList包含的对象中有一个是datetime对象。在DateTime上,我可以调用以下函数:

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

因此,为了比较,我可以这样做:

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

我应该在IF街区内做些什么?


红糖糍粑
浏览 1685回答 3
3回答

慕桂英546537

您可以使您的对象具有可比性:public&nbsp;static&nbsp;class&nbsp;MyObject&nbsp;implements&nbsp;Comparable<MyObject>&nbsp;{ &nbsp;&nbsp;private&nbsp;Date&nbsp;dateTime; &nbsp;&nbsp;public&nbsp;Date&nbsp;getDateTime()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dateTime; &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;void&nbsp;setDateTime(Date&nbsp;datetime)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.dateTime&nbsp;=&nbsp;datetime; &nbsp;&nbsp;} &nbsp;&nbsp;@Override &nbsp;&nbsp;public&nbsp;int&nbsp;compareTo(MyObject&nbsp;o)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getDateTime().compareTo(o.getDateTime()); &nbsp;&nbsp;}}然后通过调用:Collections.sort(myList);但是,有时您不想更改模型,比如您想要对几个不同的属性进行排序。在这种情况下,可以动态创建比较器:Collections.sort(myList,&nbsp;new&nbsp;Comparator<MyObject>()&nbsp;{ &nbsp;&nbsp;public&nbsp;int&nbsp;compare(MyObject&nbsp;o1,&nbsp;MyObject&nbsp;o2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;o1.getDateTime().compareTo(o2.getDateTime()); &nbsp;&nbsp;}});但是,只有当您确信dateTime在比较时不是空的时,上述方法才能工作。处理NULL也是明智的,以避免NullPointerExceptions:public&nbsp;static&nbsp;class&nbsp;MyObject&nbsp;implements&nbsp;Comparable<MyObject>&nbsp;{ &nbsp;&nbsp;private&nbsp;Date&nbsp;dateTime; &nbsp;&nbsp;public&nbsp;Date&nbsp;getDateTime()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dateTime; &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;void&nbsp;setDateTime(Date&nbsp;datetime)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;this.dateTime&nbsp;=&nbsp;datetime; &nbsp;&nbsp;} &nbsp;&nbsp;@Override &nbsp;&nbsp;public&nbsp;int&nbsp;compareTo(MyObject&nbsp;o)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(getDateTime()&nbsp;==&nbsp;null&nbsp;||&nbsp;o.getDateTime()&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getDateTime().compareTo(o.getDateTime()); &nbsp;&nbsp;}}或者在第二个例子中:Collections.sort(myList,&nbsp;new&nbsp;Comparator<MyObject>()&nbsp;{ &nbsp;&nbsp;public&nbsp;int&nbsp;compare(MyObject&nbsp;o1,&nbsp;MyObject&nbsp;o2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(o1.getDateTime()&nbsp;==&nbsp;null&nbsp;||&nbsp;o2.getDateTime()&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;o1.getDateTime().compareTo(o2.getDateTime()); &nbsp;&nbsp;}});

哔哔one

自Java 8以来,列单接口提供排序方法。结合兰卜达表达式最简单的解决方案是// sort DateTime typed listlist.sort((d1,d2) -> d1.compareTo(d2));// or an object which has an DateTime attributelist.sort((o1,o2) -> o1.getDateTime().compareTo(o2.getDateTime()));// or like mentioned by Tunakilist.sort(Comparator.comparing(o -> o.getDateTime()))

慕桂英3389331

您可以使用Collection tions.Sort方法。这是一种静态方法。把列表和比较器传递给它。它在列表上使用了一种改进的合并算法。这就是为什么你必须通过一个比较器来做这对比较。Collections.sort(myList,&nbsp;new&nbsp;Comparator<MyObject>&nbsp;{ &nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;compare(MyObject&nbsp;o1,&nbsp;MyObject&nbsp;o2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime&nbsp;a&nbsp;=&nbsp;o1.getDateTime(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime&nbsp;b&nbsp;=&nbsp;o2.getDateTime(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(a.lt(b))&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(a.lteq(b))&nbsp;//&nbsp;it's&nbsp;equals &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1; &nbsp;&nbsp;&nbsp;}});请注意,如果myList是可比较的类型(实现可比较接口的类型)(如日期、整数或字符串),则可以省略比较器,然后使用自然排序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java