def unique(arr)
return arr.keep_if { |x| arr.count(x) == 1 }
end
print unique([2, 5, 5, 4, 22, 8, 2, 8])
#=> [4, 22, 2]
值2在数组中出现两次,但是使用以下方法会错误地返回它。为什么会发生这种情况,我应该怎么做才能解决?
不幸的是,这是由于在工作方式方面存在一些隐藏行为keep_if
。为了说明这种行为,我们可以使用调试果园中挂得最少的果实,很好ol' puts
:
def unique(arr)
return arr.keep_if { |x|
puts x, arr.join(',')
arr.count(x) == 1
}
end
print unique([2, 5, 5, 4, 22, 8, 2, 8])
这为我们提供了以下输出:
2
2,5,5,4,22,8,2,8
5
2,5,5,4,22,8,2,8
5
2,5,5,4,22,8,2,8
4
2,5,5,4,22,8,2,8
22
4,5,5,4,22,8,2,8
8
4,22,5,4,22,8,2,8
2
4,22,5,4,22,8,2,8
8
4,22,2,4,22,8,2,8
[4, 22, 2]
仔细查看当方法发现要保留的新值时会发生什么情况:它将值存储在数组的早期索引之一中,覆盖已存在的值。下次找到要保留的值时,将其放在下一个位置,依此类推。
这意味着第一次keep_if
查看时2
,它会看到其中的两个,因此决定跳过它。但随后4
,它看到了要保留的a,并覆盖了第一个2
。因此,第二次看到a时2
,它决定保留它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句