0

我无法使用我自己的 Comparator 实现按 Collections.sort() 对我的集合进行排序。抛出的异常是-->“IllegalArgumentException:比较方法违反了它的一般合同!在我的 OrdersBean 中,我已经覆盖了 hashCode,如下所示:

@Override    
    public int hashCode() {
    return this.getServiceOrderName().toUpperCase().hashCode();
}

我没有覆盖 equals() 并且仅使用 Object 类的(我觉得应该不是问题)。

我已经这样实现了比较器:

public static final Comparator<OrdersBean> ordersComparator=new Comparator<OrdersBean>() {

    @Override
    public int compare(OrdersBean first, OrdersBean second)
    {
        if(Double.parseDouble(first.getPriority())<Double.parseDouble(second.getPriority()))
            return -1;
        else
            if(Double.parseDouble(first.getPriority())>Double.parseDouble(second.getPriority()))
                return +1;
            else
            {
                if((first.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")) &&
                        (second.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")))
                            return -1;

                if((first.getPlatformType().equalsIgnoreCase("T1 Augment")) &&
                        (second.getPlatformType().equalsIgnoreCase("T1 Augment")))
                            return -1;

                if(first.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD"))
                    return -1;
                else
                    if(second.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD"))
                        return +1;
                    else
                        if(first.getPlatformType().equalsIgnoreCase("T1 Augment"))
                            return -1;
                        else
                            if(second.getPlatformType().equalsIgnoreCase("T1 Augment"))
                                return +1;
                            else
                                return -1;
            }

    }
};

请建议我,我哪里错了???

我现在已将代码更改如下,它对于 sort() 方法运行良好,但它现在最终导致稍后的代码中出现错误,该比较器被传递给 Tree-Set,其中不允许重复,因此所有在比较器返回 0 的类似平台类型的情况下,这些订单不会添加到此 sortedSet;(因为不允许重复):

public static final Comparator<OrdersBean> ordersComparator=new Comparator<OrdersBean>() {

    @Override
    public int compare(OrdersBean first, OrdersBean second)
    {
        int diffProrties=(int)(Double.parseDouble(first.getPriority())-Double.parseDouble(second.getPriority()));
        if(diffProrties != 0)
            return diffProrties;

        if(first.getPlatformType().equalsIgnoreCase(second.getPlatformType()))
            return 0;

        if(first.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD"))
            return -1;
        if(second.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD"))
            return +1;
        if(first.getPlatformType().equalsIgnoreCase("T1 Augment"))
            return -1;
        if(second.getPlatformType().equalsIgnoreCase("T1 Augment"))
            return +1;

        return 0;


    }
};
4

2 回答 2

5

compare(a,b)必须相同,-compare(b, a)否则没有确定的方法来比较 a 和 b。你有

if((first.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")) &&
   (second.getPlatformType().equalsIgnoreCase("EV-DO Carrier ADD")))
       return -1;

这说 a < b AND b < a 这是没有意义的。

于 2012-07-20T20:18:47.530 回答
3

比较器必须遵守契约,特别是如果compare(A, B) < 0,那么它必须是compare(B, A) > 0。如果您使用平台“EV-DO Carrier ADD”传递两个对象,您的比较器将违反此规则。

于 2012-07-20T20:08:53.073 回答