如何使用比较器按降序排序日期

时间:2014-06-04 09:52:18

标签: java sorting date datetime map

我有一个带有getter setter和methods的bean对象testBean。我正在从数据库中检索结果并将其存储在TreeMap

Map的输出将如下所示:

{Student1 = [testBean[Dept=Science,ID=12,grade=A,Date=12-Jan-2013]]
            [testBean[Dept=Science,ID=12,grade=B,Date=14-Mar-2013]]

{Student2 = [testBean[Dept=Science,ID=02,grade=A,Date=12-Jan-2013]]
            [testBean[Dept=Science,ID=02,grade=A,Date=14-Mar-2013]]

我需要按降序排列输出,以便最新日期出现。所以我使用比较器来对日期进行排序:

public int DateCompare(Object studentObj, Object anotherStudentObj) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
    String value = ((testBean) studentObj).getDateTmTrans();
    String value1 = ((testBean) anotherStudentObj).getDateTmTrans();
    int retVal = 0;

    try {

        Date firstDate = dateFormat.parse(value);
        Date secondDate = dateFormat.parse(value1);     
        retVal = firstDate.compareTo(secondDate);

    } catch (ParseException e) {
        e.printStackTrace();
    }       
    return 0;
}

但我无法按降序排列日期。是否有任何解决方案可以获得所需的输出?

欢迎任何建议

提前致谢

4 个答案:

答案 0 :(得分:12)

  

但我无法按降序排列日期。

两个简单的选择:

  • 您可以使用secondDate.compareTo(firstDate)自行撤消比较。 (我假设在您的真实代码中,您实际上正在返回retVal;在您发布的代码中会忽略它。)
  • 调用Collections.reverseOrder(Comparator)创建一个比较原始逆序的比较器。

答案 1 :(得分:4)

不是将firstDatesecondDate进行比较,而是将secondDatefirstDate进行比较:

retVal = secondDate.compareTo(firstDate);

不要忘记返回retVal而不是0;)

答案 2 :(得分:0)

你可以在比较器的构造函数中添加一个布尔参数,例如: boolean descending,然后执行此操作:

retVal = (descending ? -1 : 1) * firstDate.compareTo(secondDate);

这里,如果您通过传递true来创建比较器,那么"降序"参数,它会翻转符号,保持0不受影响,实际上你最终得到的比较器很容易配置,以帮助你按升序/降序排序日期。

答案 3 :(得分:0)

你可以试试这个:

static final Comparator<All_Request_data_dto> byDate
    = new Comparator<All_Request_data_dto>() {
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");

    public int compare(All_Request_data_dto ord1, All_Request_data_dto ord2) {
        Date d1 = null;
        Date d2 = null;
        try {
            d1 = sdf.parse(ord1.lastModifiedDate);
            d2 = sdf.parse(ord2.lastModifiedDate);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return (d1.getTime() > d2.getTime() ? -1 : 1);     //descending
    //  return (d1.getTime() > d2.getTime() ? 1 : -1);     //ascending
    }
};