0

我使用简单的比较器并得到异常并且不知道该怎么做

这就是我所说的:

try {
   Collections.sort(this.closePositions, new PositionComperator());
}
catch(Exception e) {
   e.printStackTrace();
}

这是比较器:

  public class PositionComperator implements Comparator<DataResponse> {

    @Override
    public int compare( DataResponse pos1, DataResponse pos2) {

        if (pos1.openTime >= pos2.openTime) {
            return 1;
        } 
        else {
            return -1;
        }// returning 0 would merge keys

    }

   }

这是一个例外:

java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(Unknown Source)
at java.util.TimSort.mergeAt(Unknown Source)
at java.util.TimSort.mergeCollapse(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at GTTask.RefreshIdentityHistory.call(RefreshIdentityHistory.java:59)
at GTTask.RefreshIdentityHistory.call(RefreshIdentityHistory.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
4

3 回答 3

2

如果两个值xy具有相同的openTime,则compare(x, y)compare(y, x)都将返回 1,这违反了 的约定compare

实施者必须确保sgn(compare(x, y)) == -sgn(compare(y, x))所有xy.

你没有确保这一点。

您需要考虑当值相同时想要发生的事情openTime- 要么返回 0,要么有一些一致的概念,即哪个值应该在另一个之前。例如,您是否有一些可以执行的辅助比较?

于 2013-07-31T08:13:45.577 回答
1

你可以使用树集。这是为你整理的。并且有比较方法。例如

TreeSet<Double> sortedSet = new TreeSet<Double>(); 

例如比较它

TreeSet<Double> set = new TreeSet<Rock>(new Comparator<Double>()
public int compare(Double a, Double b){
                return a.value - b.value;
            }
        }
于 2013-07-31T08:14:33.417 回答
1

您收到此错误的原因是,当它对两个项目进行排序时,它们更改了顺序。您还应该包括它相等的情况。

最好这样做:

return po1.openTime - pos2.opentime;

或者做

if (pos1.openTime > pos2.openTime) {
    return 1;
} 
else if (pos1.openTime < pos2.openTime) {
    return -1;
} else {
    return 0;
}
于 2013-07-31T08:16:03.900 回答