我正在使用Collections.sort根据时间字段以升序对列表进行排序。 下面是代码
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;
});
此方法引发异常-
java.lang.IllegalArgumentException: Comparison method violates its general contract.
我就这个问题浏览了google-它说的是我正在将较大的对象与较小的对象进行比较。我尝试反转对象的顺序,但是没有运气。
答案 0 :(得分:1)
只有其中一个无法解析,您才捕获一次异常。
考虑以下时间的三批装运:
A-12:34
B-34:56
C-空
使用比较器,compare(A, C)
将返回0,compare(B, C)
将返回0,但是compare(A, B)
将返回非零结果,从而违反了传递性的一般约定。
一种简单的方法是使用Comparator.comparing
语法分别解析每个元素:
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;
})))
);
答案 1 :(得分:0)
您没有提到哪一行代码会引发此错误。我不确定您在这里使用哪个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());
}
货运类内容:
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 + '\'' +
'}';
}
}
输出:
[Shipments{shipmentPickingTime='12:00'}, Shipments{shipmentPickingTime='12:03'}, Shipments{shipmentPickingTime='12:02'}]
[Shipments{shipmentPickingTime='12:00'}, Shipments{shipmentPickingTime='12:02'}, Shipments{shipmentPickingTime='12:03'}]