以下是Java中Collections.binarySearch
的定义:
static <T> int binarySearch(List<? extends Comparable<? super T> list, T key)
static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
它们与以下定义(类似于Collections.sort
)的区别如何:
static <T extends Comparable<? super T>> int binarySearch(List<T> list, T key)
static <T> int binarySearch(List<T>, T x, Comparator<? super T>)
据我所知:
第一个定义允许您在值列表中搜索类型为T的键,其类型相同或者为&#34; lower&#34;某种类型知道如何比较T型或某些&#34;以上的实例&#34;类型。
第二个定义允许您在值列表中搜索类型为T的键,其类型相同或者&#34; lower&#34;比使用知道如何比较T型实例或某些&#34;以上&#34;的Comparator
的类型T类型。
基本上,我不明白为什么列出的内容不能与密钥具有相同的类型?
答案 0 :(得分:2)
第一组签名稍微一般。它适用于奇数边缘情况,第二种情况会拒绝。考虑
的情况 import java.sql.Timestamp; // extends Date implements Comparable<Date> (!)
import java.util.Date;
List<Timestamp> timestamps = ...;
Date key = ...;
int index = Collections.binarySearch(timestamps, key);
这适用于第一个签名,但在第二个签名下会被拒绝作为类型错误(您必须先将key
转换为Timestamp
。
这可能是一件罕见的事情,但正如Timestamp
和Date
的示例所示,JDK中有这样的例子。
也许,有助于记住,binarySearch
永远不需要将列表的元素与列表中的其他元素进行比较。它只是将列表的元素与给定的key
进行比较,因此,有必要要求列表元素与key
相当(并且不一定是彼此)。