0

独自のComparator実装を使用してCollections.sort()でコレクションを並べ替えるのに問題があります。スローされる例外は次のとおりです->"IllegalArgumentException:比較メソッドはその一般的なコントラクトに違反します!私のOrdersBeanで、次のようにhashCodeをオーバーライドしました:

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

私はequals()をオーバーライドしておらず、Objectクラスのequals()のみを使用しています(私が感じる問題ではないはずです)。

そして、私は次のようにコンパレータを実装しました:

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

Comparator はコントラクトに従う必要があります。特に、 の場合compare(A, B) < 0は、それでなければなりませんcompare(B, A) > 0。プラットフォーム「EV-DO Carrier ADD」で 2 つのオブジェクトを渡すと、コンパレータはこれに違反します。

于 2012-07-20T20:08:53.073 に答える