Java中字符串数组的递归二进制搜索

时间:2015-05-26 10:11:55

标签: java arrays binary-search

我已经为String数组创建了二进制搜索,该数组应该包含两个参数,一个要查找的单词以及它正在扫描的数组。我已经看了几天我的代码,尝试了不同的事情来弄清楚要做什么,但到目前为止我还没有能够使代码工作。我得到NullPointerExceptionArrayIndexOutOfBoundsException。这是我到目前为止所拥有的。

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

3 个答案:

答案 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,以容纳从0mid-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);
    }
}