以自定义方式安排记录

arranging the records in customised way

排序程序 首先按交货日期排序 & 如果同一日期有多个记录,则按交货时间排序(注意:如果一条记录同时有订购和交货日期,则应仅按交货日期排序)

08-JUN: 03.00, 6 月 8 日:04.00

然后查看没有交货日期的订购日期,它也存在于 08-JUN & 如果同一日期的多个记录按订购时间排序,则按订购日期排序

08-6 月:02.00

然后返回到下一个交货日期&如果有多个记录按交货时间排序

09-JUN: 01.00, 6 月 9 日:12.00

然后查看没有交货日期的订购日期,它也存在于 09-JUN & 如果同一日期的多个记录按订购时间排序,则按订购日期排序

09-6 月:14.00

                   **ordered date**   **orderTime**   **DeliveredDate**   **DeliveredTime**
                        24-NOV-2021      10.00            24-NOV-2021    12.00
                            -                -            24-NOV-2021    09.00
                        25-NOV-2021       9.00               -             -
                        25-NOV-2021      11.00            26-NOV-2021    12.00
                        25-NOV-2021      10.00               -             -
                        26-NOV-2021      02.00               -             -
                            -              -               10-DEC-2021     03.00
                            -                  -           10-DEC-2021    02.00
                        26-NOV-2021      04.00                -            -
                        27-NOV-2021      07.00
                        30-NOV-2021      08.00                -            -
                        28-NOV-2021      12.00
                        27-NOV-2021      14.00                 -           -

//输出应如下所示。-> 订购日期 订购时间 交货日期 交货时间

                              -                -              24-NOV-2021    09.00
                            24-NOV-2021      10.00            24-NOV-2021    12.00
                            25-NOV-2021       9.00               -             -
                            25-NOV-2021      11.00            26-NOV-2021    12.00
                            26-NOV-2021      02.00
                            26-NOV-2021      04.00                -            -
                            27-NOV-2021      07.00                -            -
                            27-NOV-2021      14.00                 -           -
                            28-NOV-2021      12.00                 -           -
                            30-NOV-2021      08.00                -            -
                                 -              -             10-DEC-2021     03.00
                                 -              -             10-DEC-2021     02.00

//The code I tried.not giving exp OP. any other way ?.->
int compareVal;
if(o1.getDeliveredDate() != null && o2.getDeliveredDate()!=null){
    compareValue  = (o1.getDeliveredDate().compareTo(o2.getDeliveredDate()));
    if (compareValue == 0 && o1.getDeliveredTime() != null && o2.getDeliveredTime() != null) {
        return (o1.getDeliveredTime().compareTo(o2.getDeliveredTime()));
    }
    return comparevalue;
} else if(o1.getDeliveredDate() != null & && o2.getDeliveredDate()==null) {
    compareValue  = (o1.getDeliveredDate().compareTo(o2.getOrderedDate()));
    if (compareValue == 0 ) {
        return -1;
    }
    return comparevalue;
} else if(o1.getDeliveredDate() == null & && o2.getDeliveredDate()!=null) {
    compareValue  = (o2.getDeliveredDate().compareTo(o1.getOrderedDate()));
    if (compareValue == 0 ) {
        return 1;
    }
    return comparevalue;
} else if(o1.getDeliveredDate() == null && o2.getDeliveredDate()==null &&
        o1.getOrderedDate() != null && o2.getOrderedDate()!=null) {
    compareValue  = (o1.getOrderedDate().compareTo(o2.getOrderedDate()));
    if (compareValue == 0 && o1.getOrderedTime() != null && o2.getOrderedTime() != null) {
        return (o1.getOrderedTime().compareTo(o2.getOrderedTime()));
    }
}
return compareVal;

在你的输出中,最后两个必须颠倒过来。这是更正后的比较顺序。它假设有日期时就会有时间。

if (o1.getOrderedDate() != null && o2.getOrderedDate() != null) {
    compareValue = (o1.getOrderedDate().compareTo(o2.getOrderedDate()));
    if (compareValue == 0) {
       return o1.getOrderedTime().compareTo(o2.getOrderedTime());
    }
    return compareValue;
} else if (o1.getDeliveredDate() != null && o2.getDeliveredDate() != null) {
    compareValue = (o1.getDeliveredDate().compareTo(o2.getDeliveredDate()));
    if (compareValue == 0) {
        return o1.getDeliveredTime().compareTo(o2.getDeliveredTime());
    }
    return compareValue;
} else if (o1.getDeliveredDate() == null && o2.getOrderedDate() == null) {
    compareValue = (o1.getOrderedDate().compareTo(o2.getDeliveredDate()));
    if (compareValue == 0) {
        return o1.getOrderedTime().compareTo(o2.getDeliveredTime());
    }
    return compareValue;
} else {
    compareValue = (o1.getDeliveredDate().compareTo(o2.getOrderedDate()));
    if (compareValue == 0) {
        return o1.getDeliveredTime().compareTo(o2.getOrderedTime());
    }
    return compareValue;
}

注意:要比较两个时间值,您不应依赖字符串的自然排序。例如:它认为 11 < 9。如果您总是为 0 到 9 小时添加 0 前缀,那么您就很好。

另一种更简单的方法

本质上,您想比较两个对象中的两个 Date/time(让我称它为 MyDateTime 作为 class 名称)即给定两个 MyDateTime 实例,您想选择 订单 日期 时间 - 如果不存在,请选择 日期时间 交货时间 否则。

一旦你有了 datetime 对(order/delivery)将它们与另一个 datetime 一对 MyDateTime 实例。

让我定义两个辅助函数来获取要用于比较的日期和整数对象。

private static Date getDateForComparison(MyDateTime myDateTime) {
    if (myDateTime.getOrderedDate() != null) {
        return myDateTime.getOrderedDate();
    }
    return myDateTime.getDeliveredDate();
}
private static String getTimeForComparison(MyDateTime myDateTime) {
    if (myDateTime.getOrderedTime() != null) {
        return myDateTime.getOrderedTime();
    }
    return myDateTime.getDeliveredTime();
}

然后,我们可以编写一个简单的比较器:

Comparator<MyDateTime> comparator = Comparator.comparing(MyDateTime::getDateForComparison)
            .thenComparing(MyDateTime::getTimeForComparison);

P.S: Java Date class 不推荐,必须视为弃用。检查 Java 8+ 替代品。