3

docs 中的示例数组一样,传递相等会返回不一致的结果:

[0, 4, 7, 10, 12].bsearch{ |x| x == 4}  # => nil
[0, 4, 7, 10, 12].bsearch{ |x| x == 7}  # => 7
[0, 4, 7, 10, 12].bsearch{ |x| x == 10} # => nil
[0, 4, 7, 10, 12].bsearch{ |x| x == 12} # => 12
[0, 4, 7, 10, 12].bsearch{ |x| x == 0}  # => nil

>=如文档所示,您可以使用;获得正确的结果 但是你也会得到:

[0, 4, 7, 10, 12].bsearch {|x| x >= 6 } #=> 7

当您专门寻找时,这不是您想要的6。你如何让它返回一致的结果?

4

1 回答 1

4

根据文档,要使用 bsearch,您的数组必须相对于块进行排序。

看着你映射出来的块结果,[false, false, true, false, false]没有排序。

您的块当前设置为使用find-minimum模式,因为它返回true/ false。相反,尝试使用find-any模式,并带有一个返回-1//的块01

[0, 4, 7, 10, 12].bsearch {|x| 7 <=> x } # => 7
[0, 4, 7, 10, 12].bsearch {|x| 6 <=> x } # => nil

在这种情况下,我们使用“比较器”或“宇宙飞船”运算符 ( <=>),它返回-1/ 0/ 1

于 2014-02-17T19:52:07.457 回答