如何解析Java Collections.sort()比较方法违反其常规约定异常
我正在使用Collections.sort根据时间字段按升序对列表进行排序。 下面是代码如何解析Java Collections.sort()比较方法违反其常规约定异常,java,spring,sorting,collections,comparator,Java,Spring,Sorting,Collections,Comparator,我正在使用Collections.sort根据时间字段按升序对列表进行排序。 下面是代码 private String getShipmentInpickingTime(List<Shipments> shipments) { logger.info("in getShipmentInpickingTime"); DateFormat sdf = new SimpleDateFormat("hh:mm"); Collections.s
private String getShipmentInpickingTime(List<Shipments> shipments) {
logger.info("in getShipmentInpickingTime");
DateFormat sdf = new SimpleDateFormat("hh:mm");
Collections.sort(shipments, (o1, o2) -> {
try {
if ((!"null".equals(o1.getShipmentinpickingtime())
&& !StringUtils.isEmpty(o1.getShipmentinpickingtime()))
&& (!"null".equals(o2.getShipmentinpickingtime())
&& !StringUtils.isEmpty(o2.getShipmentinpickingtime()))) {
return sdf.parse(o1.getShipmentinpickingtime()).compareTo(sdf.parse(o2.getShipmentinpickingtime()));
}
} catch (ParseException e) {
e.printStackTrace();
}
int count1 = 0;
return count1;
});
关于这个问题,我浏览了谷歌的网页,上面说我在比较大的物体和小的物体。我尝试反转object的顺序,但没有成功。如果元素中的任何一个未能解析,则只能捕获一次异常 考虑以下时间的三次装运:
A-12:34
B-34:56
C-null
使用比较器,
compare(A,C)
将返回0,compare(B,C)
将返回0,但是compare(A,B)
将返回非零结果,因此违反了传递性的一般约定
一种简单的方法是使用比较器。比较语法以分别解析每个元素:
DateFormat sdf = new SimpleDateFormat("hh:mm");
shipments.sort(Comparator.comparing(
Shipments::getShipmentinpickingtime,
Comparator.nullsLast(Comparator.comparing(time -> {
try {
if (!"null".equals(time) && !StringUtils.isEmpty(time)) {
return sdf.parse(time);
}
} catch (ParseException ignoe) {
// Not a valid time
}
return null;
})))
);
您没有提到哪行代码会引发此错误。我不确定您在这里使用的是哪个StringUtils,com.sun.deploy.util.StringUtils
没有.isEmpty()
方法。所以我重新实现了它
以下是解决您的问题的工作代码:
public static void main(String[] args){
getShipmentInpickingTime(new ArrayList<Shipments>(){{
add(new Shipments("12:00"));
add(new Shipments("12:03"));
add(new Shipments("12:02"));
}});
}
private static void getShipmentInpickingTime(List<Shipments> shipments) {
DateFormat sdf = new SimpleDateFormat("hh:mm");
System.out.println(shipments.toString());
Collections.sort(shipments, (o1, o2) -> {
try {
if ((!"null".equals(o1.getShipmentPickingTime())
&& !(o1.getShipmentPickingTime() == null || o1.getShipmentPickingTime().length() < 1))
&& (!"null".equals(o2.getShipmentPickingTime())
&& !(o2.getShipmentPickingTime() == null || o2.getShipmentPickingTime().length() < 1))) {
return sdf.parse(o1.getShipmentPickingTime()).compareTo(sdf.parse(o2.getShipmentPickingTime()));
}
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
});
System.out.println(shipments.toString());
}
输出:
[发货{shipmentPickingTime='12:00'},发货{shipmentPickingTime='12:03'},发货{shipmentPickingTime='12:02'}]
[Shippings{shipmentPickingTime='12:00'},Shippings{shipmentPickingTime='12:02'},Shippings{shipmentPickingTime='12:03'}]
能否请共享装运对象的字段和类型?您的装运确实有一个时间戳,上面写着“null”(不是null
)?比较器必须符合此处列出的要求:@GhostCat是的,它包含空值,但我已使用检查来防止空值。我还能做什么?@JollyRoger该字段是字符串类型,我正在将其转换为日期进行排序。如果时间为空,这会给我空指针异常。我不想抛出任何异常,只想按ASC顺序对列表进行排序。@ShreyaMahajan对此表示抱歉nullsLast
总是让我绊倒。请参阅我编辑的答案,了解正确的使用方法。
public static void main(String[] args){
getShipmentInpickingTime(new ArrayList<Shipments>(){{
add(new Shipments("12:00"));
add(new Shipments("12:03"));
add(new Shipments("12:02"));
}});
}
private static void getShipmentInpickingTime(List<Shipments> shipments) {
DateFormat sdf = new SimpleDateFormat("hh:mm");
System.out.println(shipments.toString());
Collections.sort(shipments, (o1, o2) -> {
try {
if ((!"null".equals(o1.getShipmentPickingTime())
&& !(o1.getShipmentPickingTime() == null || o1.getShipmentPickingTime().length() < 1))
&& (!"null".equals(o2.getShipmentPickingTime())
&& !(o2.getShipmentPickingTime() == null || o2.getShipmentPickingTime().length() < 1))) {
return sdf.parse(o1.getShipmentPickingTime()).compareTo(sdf.parse(o2.getShipmentPickingTime()));
}
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
});
System.out.println(shipments.toString());
}
public class Shipments {
private String shipmentPickingTime;
public Shipments(String shipmentPickingTime) {
this.shipmentPickingTime = shipmentPickingTime;
}
public String getShipmentPickingTime() {
return shipmentPickingTime;
}
public void setShipmentPickingTime(String shipmentPickingTime) {
this.shipmentPickingTime = shipmentPickingTime;
}
@Override
public String toString() {
return "Shipments{" +
"shipmentPickingTime='" + shipmentPickingTime + '\'' +
'}';
}
}