Java ConcurrentSkipListMap的自定义比较器
我需要为ConcurrentSkipListMap定义一个定制的比较器,我使用此代码根据“LogicalClock”进行排序,但结果并不像我预期的那样。我这样创建密钥:“ClientId”+:“+”LogicalClock”Java ConcurrentSkipListMap的自定义比较器,java,sorting,map,Java,Sorting,Map,我需要为ConcurrentSkipListMap定义一个定制的比较器,我使用此代码根据“LogicalClock”进行排序,但结果并不像我预期的那样。我这样创建密钥:“ClientId”+:“+”LogicalClock” classqentry{ int-AckCount; int ClientID; 长逻辑锁; } 比较器LogicalClockComparator=新比较器(){ @重写公共整数比较(字符串k1、字符串k2){ 如果(k1.与(k2)==0相比) 返回0; return(
classqentry{
int-AckCount;
int ClientID;
长逻辑锁;
}
比较器LogicalClockComparator=新比较器(){
@重写公共整数比较(字符串k1、字符串k2){
如果(k1.与(k2)==0相比)
返回0;
return(int)(Long.valueOf(k1.substring(k1.indexOf(“:”)+1))-Long.valueOf(k2.substring(k1.indexOf(“:”+1));
}
ConcurrentSkipListMap q;
q=新的ConcurrentSkipListMap(逻辑锁比较器);
在我看来像是一个打字错误(或复制/粘贴错误),也许你想使用(看这行的末尾)
而不是你所拥有的:
return (int)( Long.valueOf(k1.substring(k1.indexOf(":")+1)) -Long.valueOf(k2.substring(k1.indexOf(":")+1) ));
对我来说,这看起来像是一个打字错误(或复制/粘贴错误),也许你想使用(看这行的末尾)
而不是你所拥有的:
return (int)( Long.valueOf(k1.substring(k1.indexOf(":")+1)) -Long.valueOf(k2.substring(k1.indexOf(":")+1) ));
对于较大的时间差,这将产生令人惊讶的结果。compare应该只返回-1、0或+1,但您可以避开较大的范围。对于
long
您可能会得到一个溢出强制转换到int,这将产生意外的行为
我建议您使用Long.compare()
(如果可用)和Double.compare(如果不可用)
顺便说一句,由于地图不允许重复键,当您返回0时,它将其视为重复键,因此如果您有a:1
,b:1
和c:1
,它们都是重复键。解决方法是在比较相等的情况下比较整个字符串
BTW2虽然这是非常低效的代码,但您可以使用parseLong
而不是valueOf
来稍微改进它。这对于较大的时差会有令人惊讶的结果。compare应该只返回-1、0或+1,但您可以避开较大的范围。对于long
您可能会得到一个溢出casting为具有意外行为的int
我建议您使用Long.compare()
(如果可用)和Double.compare(如果不可用)
顺便说一句,由于地图不允许重复键,当您返回0时,它将其视为重复键,因此如果您有a:1
,b:1
和c:1
,它们都是重复键。解决方法是在比较相等的情况下比较整个字符串
BTW2虽然这是非常低效的代码,但您可以使用parseLong
而不是valueOf
来稍微改进它。除了打字错误,请注意您有两个潜在的溢出源:减去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);
除了输入错误之外,请注意,您还有两个潜在的溢出源:减去2个长字符和转换为int。可能最好使用:
Long value1 = Long.valueOf(k1.substring(k1.indexOf(":")+1));
Long value2 = Long.valueOf(k2.substring(k2.indexOf(":")+1));
return value1.compareTo(value2);
我想我需要一个结对程序员来检查打字错误。:我想我需要一个结对程序员来检查打字错误。:D