java - Binary Search 仅当搜索项为偶数时才创建无限循环

标签 java infinite-loop binary-search

对于我的类(class),我需要制作一个同时使用二分搜索和线性搜索的程序。线性搜索工作正常,所以我知道问题不在于所需的搜索词不存在。

我试图找到答案,但这似乎是一个非常独特的问题。

我正在从文件中读取图书列表,并将其放入存储书名和 ID 号的自定义 Books 类中的数组中。我是按身份证号搜索的,只要身份证号是奇数,它就可以正常工作;如果它是偶数,它会创建一个无限循环。

这是有问题的代码。

private String binarySearch(String indexNumber){

    int left, middle, right, compare;
    String book = null;
    Boolean found = false;

    left = 0;
    right = list.length -1;

    while (found == false) {
        middle = (left + right) / 2;
        compare = list[middle].index.compareTo(indexNumber);

        if (compare == 0) {
            book = list[middle].title;
            found = true;
        } else {
            if (compare > 0) {
                right = middle - 1;
                System.out.println("New Right: " + right);
            } else {
                left = middle + 1;
                System.out.println("New Left: " + left);
            }
        }
    }
    return book;
}

编辑: 修改后的代码

private String binarySearch(String indexNumber){
    int left, middle, right, compare;
    String book = null;
    left = 0;
    right = list.length -1;

    while (left <= right) {
        middle = (left + right) / 2;

        compare = list[middle].index.compareTo(indexNumber);

        if (compare == 0) {
            book = list[middle].title.toString();
            break; //tried a return here and same problem as described below
        } else {
            if (compare > 0) {
                right = middle - 1;
            } else {
                left = middle + 1;
            }
        }

    }
    return book;
}

这修复了无限循环,但它仍然只返回循环之前的空书值(但仅在偶数上,奇数仍然正确显示),即使我将 return 语句放在当前中断的位置。

最佳答案

二分查找的问题在于它坚持要找到一个匹配项;否则,它根本不会退出。

要解决此问题,请替换 found == false条件为 left <= right :

while (left <= right) {
    ...
    if (compare == 0) {
        book = list[middle].title;
        break;
    }
    ...
}

关于java - Binary Search 仅当搜索项为偶数时才创建无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34090328/

相关文章:

java - 如何使用 Scanner 处理无效输入(InputMismatchException)引起的无限循环

java - 在方法内使用binarySearch

java - 如何忽略非整数输入并继续接受输入

java - 如何在mongodb中的单个字段中添加值

python - 为什么这是 python 中的无限循环?

JAVA:创建菜单循环

java Arrays.binarySearch() 在不区分大小写的搜索中无法找到字符串

java - 在数组中搜索某个数字 10 次并计算每次搜索的时间

java - 反编译java类文件

java - 反序列化时忽略属性