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);
    }
}