独自の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;
}
};