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

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

ツリーセットを使用できます。それはあなたのためにそれを並べ替えます。また、compare メソッドがあります。例えば

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

このエラーが発生する理由は、2 つのアイテムを並べ替えたときに順序が変更されたためです。等しい場合も含める必要があります。

できれば次のことを行います。

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 に答える