为何Ruby的bsearch方法在匹配双元素数组首元素时返回nil?
为什么Ruby的bsearch在数组[1,2]时返回nil?
你遇到的问题是因为Ruby的bsearch方法有两种不同的工作模式,而你的代码用了不符合需求的模式:
1. 布尔块模式的限制
当你给bsearch传递一个返回布尔值的块时,它要求数组是单调分区的:要么所有不满足条件的元素在前,满足的在后;要么反过来。但这个模式的逻辑是找分区边界的元素:
- 如果数组是「不满足→满足」的分区(比如找
el > 1,数组[1,2]返回false, true),bsearch会返回第一个满足条件的元素(2); - 如果数组是「满足→不满足」的分区(比如你的例子,找
el < 2,数组[1,2]返回true, false),bsearch会尝试找第一个不满足条件的元素(2),但这个元素不满足你的块条件(返回false),因此最终返回nil。
2. 正确的用法:整数块模式
如果你想通过二分查找找到小于2的元素,应该使用返回整数的块模式(类似C语言的bsearch逻辑):
arr = [1, 2] arr.bsearch { |el| el < 2 ? 0 : 1 } # 返回1
块返回的整数含义:
- 返回
0:找到目标元素; - 返回正数:目标元素在当前元素的左侧;
- 返回负数:目标元素在当前元素的右侧。
3. 补充说明
如果不需要二分查找的效率,直接用find方法更直观:
arr.find { |el| el < 2 } # 返回1
内容的提问来源于stack exchange,提问作者andgursky
相关产品推荐
相关产品推荐

