Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentSkipListMap的自定义比较器_Java_Sorting_Map - Fatal编程技术网

Java ConcurrentSkipListMap的自定义比较器

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(

我需要为ConcurrentSkipListMap定义一个定制的比较器,我使用此代码根据“LogicalClock”进行排序,但结果并不像我预期的那样。我这样创建密钥:“ClientId”+:“+”LogicalClock”

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