为什么key < x[mid]下面的条件会导致编译器抱怨操作符未定义?
在C++中,只有当类型T不支持运算符<语义时,这才是编译时警告.你如何在Java中做同等的事情?
package search;
public class BinarySearch<T>
{
public boolean binary_search_iterative (T[] x, T key)
{
int size = x.length;
if ( size == 0 ) { return false; }
int end = size - 1;
int start = 0;
while ( start <= end)
{
int mid = (end + start)/2 ;
if (key < x[mid])
{
end = mid - 1;
}
else if ( key > key[mid])
{
start = mid + 1;
}
else
{
return true;
}
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
Jac*_*ack 20
Java中没有运算符重载.要获得类似的结果,您应该研究Comparable<T>哪些是为对象提供相同的功能.
所以在你的情况下它将是:
key.compareTo(x[mid]) < 0
Run Code Online (Sandbox Code Playgroud)
但是为了使这项工作你必须提供一个有界的类型变量,T是不够的,因为编译器无法推断出用于代替T实现的类型,Comparable所以你应该使用:
public class BinarySearch<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)
这是因为泛型不像在C++中那样实现,其中根据使用它们的类型在编译阶段构建模板.您必须明确说明您T的身份,因为类型检查器需要这样做.
在Java中,您不能重载运算符.
通常解决的方法是让您的密钥类实现Comparable<T>接口,并覆盖其compareTo()方法.
然后,您可以将类型参数限制T为仅实现Comparable的类型,例如:
BinarySearch<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)
并使用compareTo()而不是<.