我有这段代码片段,在这里,我期望使用retain函数从运行作业的可变HashSet中删除带有给定HashSet的返回作业,但是没有删除预期的条目。下面有一些调试代码及其输出(远低于下面),这些代码在集合中迭代,以显示集合中有一个元素与测试元素相等,但是当retain函数仅用于保留不等于该作业id的元素时,set大小不会改变。
if(action=="request_this") {
println("RS >%d<\n".format(job.job_id))
for(j <- jobs_running) println(">%d< ".format(j.job_id) + (if(j.job_id==job.job_id) "true" else "false"))
}
val c1 = jobs_running.size
jobs_running.retain(x => x.job_id!=job.job_id)
println(action+" NET CHANGE %d".format(jobs_running.size-c1))输出:
RS >1259<
>1055< false
>1019< false
>1051< false
>1083< false
>1015< false
>1215< false
>1127< false
>1259< true
>1107< false
>1047< false
>1035< false
request_this NET CHANGE 0让我更加困惑的是,调试代码中引用的"action“var只是相当于返回作业对象中的action_id的明文。只有对于一个作业操作类型"request_this“,我才能重现这个问题。如果它是另一种类型,那么我将得到预期的输出ex:
request_that NET CHANGE -1UPDATE --一般的共识似乎与哈希码有关。我修改了我的调试代码,以输出作业对象和job_id值的哈希码。
if(action=="request_screenshot") {
println(">>%d< ".format(job.job_id) + job.hashCode + " " + job.job_id.hashCode+"\n")
for(j <- jobs_running) println(">%d< ".format(j.job_id) + j.hashCode + " " + j.job_id.hashCode)
}返回的输出类似于测试作业的哈希代码(第一行),以及集中的作业与job_id值和整个作业对象匹配(我在匹配的set元素打印输出旁边放了一个*):
>>1267< 1619488678 1267
>1015< 2124747326 1015
>1043< -183172091 1043
>1107< -353858330 1107
>1123< -1258875190 1123
>963< 1958632623 963
>1039< 226958301 1039
>1023< 148063445 1023
>1215< -972672885 1215
>959< 283572883 959
>971< -2080242470 971
>1091< -1549619606 1091
>1019< -529588663 1019
>1047< -552719093 1047
>967< 626939580 967
>1035< 1782547037 1035
>1263< -874427822 1263
>1027< -228877131 1027
>1031< 441847990 1031
*>1267< 1619488678 1267
>1211< -1435736028 1211
>1191< 48617136 1191
>1119< -1737229053 1119
>1011< 1056625401 1011
>1127< -1547902819 1127
>1251< -358437524 1251UPDATE2 --我最终重写了我的代码,这样Job是完全不可变的,并且症状似乎已经解决了,尽管我仍然希望我能理解到底发生了什么。对于hashcode/equals是罪魁祸首,值得一提的是,Job是使用"case类“定义的。
发布于 2013-10-19 00:26:18
两个问题:
hashCode的实现是否遵循要求?也许您可以提供它们的实现。hashCode使用的字段是否是不可变的,或者在插入到集合后不会发生变异?编辑
第三个问题:
HashSet,不是SortedSet,对吗?在SortedSet上,您也需要担心Ordering实现。https://stackoverflow.com/questions/19459488
复制相似问题