2012-12-14 170 views
0

我需要定義一個定製的比較來ConcurrentSkipListMap,我使用此代碼基於「LogicalClock」進行排序,但結果並不如我所料。我創建這樣的關鍵:「客戶端Id」 +「:」 +「LogicalClock」自定義比較的ConcurrentSkipListMap

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); 

回答

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))); 
+0

我想我需要一個程序員對檢查錯字。 :D – nourani

1

這將有較大的時間差令人吃驚的結果。比較應該只返回-1,0或+1,但你可以逃脫更大的範圍。對於long,您喜歡將溢出轉換爲具有意外行爲的int。

我建議你使用Long.compare()如果可用,Double.compare如果事實並非如此。

順便說一句,作爲地圖不允許重複鍵,當你返回0,它把它作爲一個重複的,所以如果你有a:1b:1c:1他們都是重複的。解決這個問題的方法是比較整個字符串,如果比較相等。

BTW2雖然這是非常低效的代碼,你可以使用parseLong而不是valueOf略有改善。

+0

感謝您的諮詢。 – nourani

1

除了錯字,請注意,你有2個可能的溢出來源:減去2個多頭,當鑄造爲int時。或許,這將更好地使用:

Long value1 = Long.valueOf(k1.substring(k1.indexOf(":")+1)); 
Long value2 = Long.valueOf(k2.substring(k2.indexOf(":")+1)); 
return value1.compareTo(value2); 
+0

我申請了這個,感謝您的建議。 – nourani