首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何解决Java Collections.sort()比较方法违反了它的一般约定异常

如何解决Java Collections.sort()比较方法违反了它的一般约定异常
EN

Stack Overflow用户
提问于 2019-06-21 21:16:42
回答 1查看 508关注 0票数 0

我使用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.

我通过谷歌了解了这个问题--它说我正在比较较大的对象和较小的对象。我试着颠倒了物体的顺序,但没有成功。

EN

回答 1

Stack Overflow用户

发布于 2019-06-26 14:33:47

您没有提到哪行代码抛出了这个错误。我不确定您在这里使用的是哪个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'}]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56704242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档