java包中的总包_Java Comparator:违反总承包

所以我有这个比较器:

import java.util.Comparator;

public class SolutionComparator implements Comparator {

private final int target;

public SolutionComparator(int target) {

this.target = target;

}

@Override

public int compare(ExpressionTree o1,ExpressionTree o2) {

int v1 = o1.getValue();

int v2 = o2.getValue();

if (v1 == -1 && v2 == -1)

return 0;

else if (v1 == -1)

return 1;

else if (v2 == -1)

return -1;

else if (v1 == v2)

return (int)Math.signum(solutionCost(o1) - solutionCost(o2));

else

return (int)Math.signum(Math.abs(target-v1) - Math.abs(target-v2));

}

private int solutionCost(ExpressionTree v) {

int cost = 0;

Operation o = v.getOperator();

if (o != Operation.NONE) {

cost += o.getCost();

for (ExpressionTree e : v.getChildren())

cost += solutionCost(e);

}

return cost;

}

}

几个月来我一直在看这个代码,我无法找出它违反比较器总合同的原因.

这个想法是每个ExpressionTree可以被评估为一个结果. (getValue()方法).如果它返回-1,它总是高于其他数字.如果值不同,则比较它与目标的接近程度.如果值相同,则按解决方案成本进行比较.

使用此比较器,Java抛出IllegalStatesException.但如果我删除基于成本的比较,它就有效.

编辑:异常跟踪

Exception in thread "Thread-3" java.lang.IllegalArgumentException: Comparison method violates its general contract!

at java.util.TimSort.mergeHi(TimSort.java:868)

at java.util.TimSort.mergeAt(TimSort.java:485)

at java.util.TimSort.mergeCollapse(TimSort.java:408)

at java.util.TimSort.sort(TimSort.java:214)

at java.util.TimSort.sort(TimSort.java:173)

at java.util.Arrays.sort(Arrays.java:659)

at java.util.Collections.sort(Collections.java:217)

at ***.run(***:123)

at java.lang.Thread.run(Thread.java:722)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值