0

ConcurrentSkipListMap にカスタマイズされたコンパレータを定義する必要があります。このコードを使用して「LogicalClock」に基づいて並べ替えますが、結果は期待どおりではありません。次のようなキーを作成します: "ClientId"+":"+"LogicalClock"

class Qentry{
    int  AckCount;
    int ClientID; 
    long LogicalClock;
}

Comparator<String> LogicalClockComparator = new Comparator<String>() {
        @Override public int compare(String k1, String k2) {
            if  (k1.compareTo(k2)==0)
                    return 0;
            return   (int)( Long.valueOf(k1.substring(k1.indexOf(":")+1)) -Long.valueOf(k2.substring(k1.indexOf(":")+1) ));
        }
ConcurrentSkipListMap<String,Qentry> q;
q =new ConcurrentSkipListMap<String,Qentry>(LogicalClockComparator);
4

3 に答える 3

2

私にはタイプミス(またはコピー/貼り付けエラー)のように見えます、多分あなたは使いたいでしょう(行の終わりを見てください)

return   (int)( Long.valueOf(k1.substring(k1.indexOf(":")+1)) -Long.valueOf(k2.substring(k2.indexOf(":")+1) ));

あなたが持っていたものの代わりに:

return   (int)( Long.valueOf(k1.substring(k1.indexOf(":")+1)) -Long.valueOf(k2.substring(k1.indexOf(":")+1) ));
于 2012-12-14T11:34:54.623 に答える
1

これは、大きな時間差に対して驚くべき結果をもたらします。compareは、-1、0、または+1のみを返す必要がありますが、より広い範囲で回避できます。あなたはlong予期しない振る舞いをするであろうintへのオーバーフローキャストを取得するのが好きです。

Long.compare()利用できる場合と利用できない場合は、使用することをお勧めしますDouble.compare

ところで、マップは重複キーを許可しないため、0を返すと、それを重複として扱います。したがって、がある場合、a:1それらはすべて重複です。これを回避する方法は、比較が等しい場合に文字列全体を比較することです。b:1c:1

ところで、これはかなり非効率的なコードですが、少し改善するparseLong代わりに使用できます。valueOf

于 2012-12-14T11:36:48.603 に答える
1

タイプミスとは別に、オーバーフローの潜在的な原因が2つあることに注意してください。2つのlongを減算する場合と、intにキャストする場合です。おそらく使用する方が良いでしょう:

Long value1 = Long.valueOf(k1.substring(k1.indexOf(":")+1));
Long value2 = Long.valueOf(k2.substring(k2.indexOf(":")+1));
return value1.compareTo(value2);
于 2012-12-14T11:37:37.100 に答える