以定制的方式排列记录
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 - 如果不存在,请选择 deliverydate 和 time /em> 否则。
一旦你有一个 date 和 time 对(订单/交货)将它们与另一个 date 和 time 一对其他 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定制桌面图片按照安装时间顺序排列