我已经为String数组创建了二进制搜索,该数组应该包含两个参数,一个要查找的单词以及它正在扫描的数组。我已经看了几天我的代码,尝试了不同的事情来弄清楚要做什么,但到目前为止我还没有能够使代码工作。我得到NullPointerException
或ArrayIndexOutOfBoundsException
。这是我到目前为止所拥有的。
public int recSearch(String[] words, String wordToFind)throws ItemNotFoundException {
int start = 0;
int end = words.length - 1;
int mid = (start + end) /2;
if(end < start) {
return -1;
} else if (words[mid].equals(wordToFind)) {
incrementCount();
return mid;
} else if(words[mid].compareTo(wordToFind) < 0) {
String[] split = new String[mid - 1];
for(int i = 0; i < mid; i++) {
split[i] = words[i];
}
return recSearch(split,wordToFind);
} else if(words[mid].compareTo(wordToFind) > 0) {
String[] split = new String[mid - 1];
for(int i = 0; i < mid -1; i++) {
split[i] = words[i];
}
return recSearch(split,wordToFind);
}
return -1;
// throw new ItemNotFoundException();
}
答案 0 :(得分:0)
为了实现二进制搜索,您可以使用Collections类使用binary search搜索元素。 您只需使用
进行搜索即可Collections.binarySearch(List,Object)
在这里用
替换整个方法`int index= Collections.binarySearch(Arrays.toString(words),` "search_key");
答案 1 :(得分:0)
你在这段代码中错误地编码了它:
else if(words[mid].compareTo(wordToFind) < 0){
String[] split = new String[mid - 1];
for(int i = 0; i < mid; i++){
split[i] = words[i];
}
return recSearch(split,wordToFind);
}
else if(words[mid].compareTo(wordToFind) > 0)
{
String[] split = new String[mid - 1];
for(int i = 0; i < mid -1; i++){
split[i] = words[i];
}
return recSearch(split,wordToFind);
}
第一个else if
数组的大小应为mid
,以容纳从0
到mid-1
的值。在第二个else if
中,您要填的是words[i+ mid+1] in words[i]
。
答案 2 :(得分:0)
你分裂数组的方式有误。我在下面纠正了它。 请比较代码,您将了解出现了什么问题(在这种情况下添加输出有很大帮助)
public int recSearch(String[] words, String wordToFind) throws ItemNotFoundException {
int start = 0;
int end = words.length;
int mid = end / 2;
if(end < start){
return -1;
} else if(wordToFind.equals(words[mid])) {
incrementCount();
return mid;
} else if(wordToFind.compareTo(words[mid]) < 0) {
String[] split = new String[mid];
for(int i = 0; i < mid; i++){
split[i] = words[i];
}
return recSearch(split,wordToFind);
} else {
String[] split = new String[end - mid - 1];
for(int i = 0; i < end - mid - 1; i++){
split[i] = words[mid + i + 1];
}
return recSearch(split, wordToFind);
}
}