以定制的方式排列记录

Posted

技术标签:

【中文标题】以定制的方式排列记录【英文标题】:arranging the records in customised way 【发布时间】:2022-01-05 13:22:04 【问题描述】:

排序过程 先按交货日期排序,如果同一日期有多条记录,按交货时间排序(注意:如果一条记录同时有订购日期和交货日期,则只能按交货日期排序)

08-6 月:03.00, 08-6月:04.00

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

08-6 月:02.00

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

09-6 月:01.00, 09-6月:12.00

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

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

//输出应该像下面这样.-> 订购日期 orderTime DeliveredDate DeliveredTime

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

【问题讨论】:

[delivered|ordered]Date and Time的类型是什么? 日期 -Java util(交付和订购日期)。订购时间和交货时间的字符串 如果一个订单在 11 月 24 日下单并在 11 月 28 日发货,另一个订单在 11 月 26 日下单并在同一天发货,那么第三个在 11 月 25 日下单且没有发货日期的订单应放入排序顺序中? 11 月 25 日没有交货日期应该排在最前面。 nxt 11 月 26 日记录和最后 11 月 24 日- 11 月 28 日 谢谢。但是在你的预期输出订单日期26-NOV-2021 02.00 不早于交货日期26-NOV-2021 12.00,所以我还没有完全理解。您的要求是否明确且一致? 【参考方案1】:

在您的输出中,最后两个必须颠倒。这是更正的比较顺序。它假定日期存在时会存在时间。

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 前缀,那么你很好。

另一种更简单的方法

本质上,您想比较两个对象的两个日期/时间(让我将其称为MyDateTime 作为类名)即,给定两个MyDateTime 实例,您想要选择日期 order 的 em> 和 time - 如果不存在,请选择 deliverydatetime /em> 否则。

一旦你有一个 datetime 对(订单/交货)将它们与另一个 datetime 一对其他 MyDateTime 实例。

让我定义两个辅助函数来获取用于比较的 Date 和 Integer 对象。

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 类,必须将其视为已弃用。检查 Java 8+ 的替代品。

【讨论】:

以上是关于以定制的方式排列记录的主要内容,如果未能解决你的问题,请参考以下文章

Android 11.0 Launcher定制桌面图片按照安装时间顺序排列

Android 11.0 Launcher定制桌面图片按照安装时间顺序排列

如何以编程方式使用自动布局排列这三个 UILabel?

MATLAB以不同方式随机排列列

Windows中对窗口的排列方式有几种

自动布局 - 以编程方式垂直排列元素,中间有空格?