首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >意外HashSet.retain行为

意外HashSet.retain行为
EN

Stack Overflow用户
提问于 2013-10-18 21:43:29
回答 1查看 73关注 0票数 1

我有这段代码片段,在这里,我期望使用retain函数从运行作业的可变HashSet中删除带有给定HashSet的返回作业,但是没有删除预期的条目。下面有一些调试代码及其输出(远低于下面),这些代码在集合中迭代,以显示集合中有一个元素与测试元素相等,但是当retain函数仅用于保留不等于该作业id的元素时,set大小不会改变。

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
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:

代码语言:javascript
复制
request_that NET CHANGE -1

UPDATE --一般的共识似乎与哈希码有关。我修改了我的调试代码,以输出作业对象和job_id值的哈希码。

代码语言:javascript
复制
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元素打印输出旁边放了一个*):

代码语言:javascript
复制
>>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 1251

UPDATE2 --我最终重写了我的代码,这样Job是完全不可变的,并且症状似乎已经解决了,尽管我仍然希望我能理解到底发生了什么。对于hashcode/equals是罪魁祸首,值得一提的是,Job是使用"case类“定义的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-19 00:26:18

两个问题:

  1. hashCode的实现是否遵循要求?也许您可以提供它们的实现。
  2. hashCode使用的字段是否是不可变的,或者在插入到集合后不会发生变异?

编辑

第三个问题:

  1. 这是HashSet,不是SortedSet,对吗?在SortedSet上,您也需要担心Ordering实现。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19459488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档