我假设存在一个Widget类,该类实现Comparable接口,因此具有一个compareTo method 方法,该方法接受Object参数并返回一个int。我想编写一个高效的静态方法getWidgetMatch,它具有两个参数。 第一个参数是对Widget对象的引用。 第二个参数是可能非常大的Widget对象数组,这些对象已基于Widget compareTo 方法以升序排序。 getWidgetMatch根据equals方法在数组中搜索与第一个参数匹配的元素,如果找到则返回true,否则返回false。
我将分享两个我几乎可以使用的代码以及调试中的错误。希望有人能听到我没有的答案。
代码1:
public static boolean getWidgetMatch(Widget a, Widget[] b){
int bot=0;
int top=b.length-1;
int x = 0;
int y=0;
while (bot >= top)
{
x = (top + bot/2);
y = a.compareTo(b[x]);
if (y==0)
return true;
if (y<0)
top=x;
else
bot=x;
return false;
}
return a.equals(b[x]);
}
这个的调试语句是这样的,[LWidget; @ 5305068a
→
如果应为true,则为false。我可能会错过一个“>”号吗?
代码2:
public static boolean getWidgetMatch(Widget a, Widget[] b) {
for(int i =0;i<b.length;i++){
if(b[i].compareTo(a)== 0)return true;
}
return false;
}
这个的调试语句是这样的, [LWidget; @ 5305068a→应该为true时为true,这是我对此代码最困惑的地方。
我可能会错过“ +”或“-”或“ /”符号吗?
谢谢。
答案 0 :(得分:0)
尝试一下:
public static boolean getWidgetMatch(Widget object, Widget[] wList){
int low = 0;
int high = wList.length - 1;
while(low <= high){
int middle = low + (high-low)/2;
if(object.compareTo(wList[middle]) < 0)
high = middle - 1;
else if(object.compareTo(wList[middle]) > 0)
low = middle + 1;
else
return true;
}
return false;
}