Java中字符串数组的递归二进制搜索
我已经为字符串数组创建了一个二进制搜索,该数组应该包含两个参数,一个要查找的单词和它正在扫描的数组。我已经研究我的代码好几天了,试着做不同的事情来找出该做什么,但到目前为止,我还不能让代码正常工作。我要么得到一个Java中字符串数组的递归二进制搜索,java,arrays,binary-search,Java,Arrays,Binary Search,我已经为字符串数组创建了一个二进制搜索,该数组应该包含两个参数,一个要查找的单词和它正在扫描的数组。我已经研究我的代码好几天了,试着做不同的事情来找出该做什么,但到目前为止,我还不能让代码正常工作。我要么得到一个NullPointerException要么得到一个ArrayIndexOutOfBoundsException。这是我到目前为止所拥有的 public int recSearch(String[] words, String wordToFind)throws ItemNotFound
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();
}
public int recSearch(String[]words,String wordToFind)抛出ItemNotFoundException{
int start=0;
int end=words.length-1;
int mid=(开始+结束)/2;
如果(结束<开始){
返回-1;
}else if(words[mid].equals(wordToFind)){
递增计数();
中途返回;
}else if(words[mid]。比较到(wordToFind)<0){
String[]split=新字符串[mid-1];
对于(int i=0;i0){
String[]split=新字符串[mid-1];
对于(int i=0;i
要实现二进制搜索,可以使用类来搜索元素。
您只需使用
Collections.binarySearch(List,Object)
在这里,您将整个方法替换为
`int index= Collections.binarySearch(Arrays.toString(words),` "search_key");
您在这部分代码中的编码错误:
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(words[mid].compareTo(wordToFind)<0){
String[]split=新字符串[mid-1];
对于(int i=0;i0)
{
String[]split=新字符串[mid-1];
对于(int i=0;i
在第一个
else if
中,数组的大小应为mid
,以容纳0
到mid-1
之间的值。在第二个else if
中,您要填写的是单词[i]中的单词[i+mid+1]拆分数组的方式有一个错误。我在下面更正了它。
请比较代码,您将了解出了什么问题(添加输出在这种情况下非常有帮助)
public int recSearch(String[]words,String wordToFind)抛出ItemNotFoundException{
int start=0;
int end=words.length;
int mid=end/2;
如果(结束<开始){
返回-1;
}else if(wordToFind.equals(words[mid])){
递增计数();
中途返回;
}else if(wordToFind.compareTo(words[mid])<0){
字符串[]拆分=新字符串[mid];
对于(int i=0;i
我只是想确定一下-是否将排序数组传递给上述函数?结果通常是1或2。您的两个返回声明是错误的<代码>返回recSearch(拆分,wordToFind)
应替换为return recSearch(split,wordToFind)+start代码>是,这是一个排序数组。添加+开始不起作用,仍然得到例外op没有要求开箱即用的解决方案,因此这没有回答问题。我仍然得到ArrayOutOfBoundsException。请提供一个示例数组,我将尝试查看问题所在;-)当我这样调整它时,我得到的每个输出都是-1,因为endpublic 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);
}
}