我不明白为什么当数组有2个值时bsearch方法返回nil.

arr = [1, 2]

arr.bsearch { |el| el < 2 }

推荐答案

100 doc

您只需要仔细阅读Array#bsearch份文档即可.它指出bsearch有两种形式或模式:"find-minimum模式和find-any mode.在任何一种情况下,数组的元素都必须相对于块是单调的(或排序的)."对于find-minimum模式,块返回truefalse;对于find-any模式,块返回与数组元素相同的类值.因此,您正在使用查找最小值模式.

同样来自文档,在find-minimum模式下"必须有一个索引i, 0 <= i <= ary.size,以便:

  • 对于索引小于i的任何元素,块返回false;并且
  • 对于索引大于或等于i的任何元素,该块返回true.

此方法返回第i个元素.如果i等于ary.size,则返回零."

Examining your code

现在让我们判断一下您的声明,稍微修改一下:

arr = [1, 2, 3]
arr.bsearch { |el| el < 2 } #=> nil

我们希望找到满足使用bsearch所施加的要求的指数012.

假设兴趣指数是0.由于没有小于零的指数,因此我们测试arr[1] < 2arr[2] < 2(2 < 23 < 2)是否都是true.事实上两者都是false.因此,指数0不再考虑.

现在假设文档中提到的指数是1.我们要求arr[0] < 2 false,但它是true.因此我们可以排除指数1.

为了使指数等于2,我们要求arr[0] < 2arr[1] < 2都是false,但实际上都是true.

由于没有满足使用besearch要求的索引,因此返回nil.

Correcting your code

显然,对于arr = [1, 2, 3],该表达必须写如下.

arr.bsearch { |el| el >= 2 }      #=> 2
arr.bsearch { |el| el > 2  }      #=> 3
arr.bsearch { |el| el > 0  }      #=> 1
arr.bsearch { |el| el > 3  }      #=> nil

Other examples

以下是数组包含integer的更多示例.

ary = [2, 4, 6]

ary.bsearch { |el| el > -99 }     #=> 2
ary.bsearch { |el| el > 1 }       #=> 2
ary.bsearch { |el| el > 2 }       #=> 4
ary.bsearch { |el| el >= 2 }      #=> 2
ary.bsearch { |el| el >= 6 }      #=> 6
ary.bsearch { |el| el > 6 }       #=> nil

The array can be non-increasing

请注意,数组不需要是非递减的,只需monotone,这意味着非递减或非递减.这是一个例子,其中数组是非增的(实际上是严格减的).区块计算当然必须进行相应调整.

ary = [6, 4, 2]

ary.bsearch { |el| el <= 7 }    #=> 6
ary.bsearch { |el| el <= 99}    #=> 6
ary.bsearch { |el| el < 5 }     #=> 4
ary.bsearch { |el| el <= 4 }    #=> 4
ary.bsearch { |el| el < 4 }     #=> 2
ary.bsearch { |el| el <= 2 }    #=> 2
ary.bsearch { |el| el < 2 }     #=> nil  
ary.bsearch { |el| el <= 1 }    #=> nil

The array may contain non-numeric values

唯一的要求是成对的元素可以与飞船操作员<=>进行比较.如果a < ba <=> b返回-1,如果a == b,则返回0,如果a > b,则返回1.

例如,在字符串的情况下,String#<=>bsearch使用.以下是一些例子.

ary = ['brush', 'keep', 'task']

ary.bsearch { |s| s >= 'hi' }     #=> "keep"
ary.bsearch { |s| s >= 'align' }  #=> "brush"
ary.bsearch { |s| s >= 'mama' }   #=> "task"
ary.bsearch { |s| s >= 'tar' }    #=> "task"
ary.bsearch { |s| s >= 'tax' }    #=> "nil"

Ruby相关问答推荐

Ruby 扁平化 JSON 对象或哈希

ruby 组合哈希相关键

如何在 Ruby 中验证来自多项 Select 提示的命令行输入?

Ruby 是否提供了一种使用指定编码执行 File.read() 的方法?

我如何判断哪些模块已混合到一个类中?

用于 ruby​​ gems 的新 10.9 OSX 的命令行工具?

从单独的文件中包含一个 Ruby 类

您如何将 Cucumber 场景标记为待处理

将方法应用于数组/可枚举中的每个元素

在 Ubuntu 上安装 Ruby 1.9.1?

在 Ruby 中创建数字、字符串、数组或哈希的 md5 哈希

无法正确自动生成 Ruby DevKit 配置文件

以条件方式构建哈希

理解 Ruby 中的私有方法

Ruby中的file.open、open和IO.foreach,有什么区别?

Sublime Text 2 控制台输入

何时使用在 Ruby 中启动子进程的每种方法

Ruby:define_method 与 def

*nix 是什么意思?

如何将 270921sec 转换为天 + 小时 + 分钟 + 秒? (Ruby)