2012-12-14 61 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