【问题标题】:how to sort date in descending order using comparator如何使用比较器按降序对日期进行排序
【发布时间】:2014-07-24 21:58:18
【问题描述】:

我有一个带有 getter setter 和方法的 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;
}

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

欢迎提出建议

提前致谢

【问题讨论】:

    标签: java sorting date datetime map


    【解决方案1】:

    你可以试试这个:

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

    【讨论】:

    • 感谢您的贡献。与其他答案相比有什么优势吗?
    【解决方案2】:

    您可以在比较器的构造函数中添加一个布尔参数,例如boolean descending 然后这样做:

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

    在这里,如果您通过将 true 作为“降序”参数传递来创建比较器,它将翻转符号,使 0 不受影响,并且实际上您最终会得到一个易于配置的比较器,以帮助您在升序/降序。

    【讨论】:

    • 正如我在另一个(现已删除的答案)中指出的:如果 firstDate.compareTo(secondDate) 返回 Integer.MIN_VALUE,则此操作失败。这是一种已知的颠倒排序的错误方式。
    【解决方案3】:

    不要比较 firstDatesecondDate,而是比较 secondDatefirstDate

    retVal = secondDate.compareTo(firstDate);
    

    别忘了返回retVal 而不是0 ;)

    【讨论】:

      【解决方案4】:

      但我无法按降序对日期进行排序。

      两个简单的选择:

      • 您可以自己反转比较,使用secondDate.compareTo(firstDate)。 (我假设在你的真实代码中你实际上返回了retVal;它在你发布的代码中被忽略了。)
      • 调用Collections.reverseOrder(Comparator) 以创建一个与原始比较器相反顺序的比较器。

      【讨论】:

      • 向大家道歉提出一个愚蠢的问题。实际上我在我的代码中犯了一个错误,没有返回 retVal。感谢@Jon Skeet 指出..我没有编辑我的代码。有人来自论坛的可以关闭此主题,因为它对论坛中的查看者没有任何用途..谢谢大家并道歉..
      • @jegadees:所以你的意思是你的问题与降序无关,而与比较器一开始就被破坏有关吗? (顺便说一下,我还强烈建议您将日期存储为 DateCalendar 值而不是字符串。为什么要一直解析?)
      • 是的。降序没有问题。比较器中未返回 retVal 的断开链接导致了问题。我同意您存储为日期的解决方案。将在此处实现相同.非常感谢
      • 啊,所有的答案似乎都很完美。但我无法标记所有的答案..所以赞成..谢谢大家
      • @jegadees 仅供参考,Joda-Time 和 java.time 库都提供了 LocalDate 类来表示此类数据,即没有时间的日期。
      猜你喜欢
      • 2017-04-29
      • 2013-05-09
      • 2013-01-10
      • 2016-10-15
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多