从文档中引用它说java.util.Collections.binarySearch(List<? extends Comparable<? super T>> list, T key)
返回。。。
搜索关键字的索引(如果该索引包含在列表中);否则,(-(插入点)-1)。插入点定义为将密钥插入列表的点:大于键的第一个元素的索引,或者如果列表中的所有元素都小于指定的键。。。
我的问题是,定理(-(insertion point) - 1)
有什么意义(如果有的话),以至于它是找不到键时的返回值?为什么不直接返回insertion point
呢?
首先,如果找不到元素,必须根据文档返回负值,否则无法区分已找到和未找到。
好吧,为什么不只是-insertion point
呢?想象一下,如果插入点是0(搜索到的元素比所有现有元素都小),那么逻辑就会中断——找不到将返回一个非负数。因此产生了额外的CCD_ 5。
好吧,为什么不总是-1
呢?
因为知道排序列表中不匹配的插入点对于查找问题的答案是有用的,例如:
下一个比我要求的元素更大的元素是什么?
和
有多少元素比我(没有)找到的元素大?
而且,按照二进制搜索的工作方式,算法在索引终止时就知道这个索引,所以为什么不在不需要额外费用的情况下共享它呢?
从相同的文档中,如果键存在,则返回值必须>=0。如果所有元素都大于键,则insertion point
可能为零,即使键不存在,也会导致返回值为零。另一方面,值(-(insertion point) - 1)
总是小于零。
请注意,这保证了当且仅当找到键时,返回值将>=0。
这是一种将两个用例组合成一个方法调用的方法。当找不到元素时,List.indexOf()
和类似的方法只会返回-1,但Collections.binarySearch()
更进一步,返回一个负数,这在逐个元素构建排序列表时也很有用。