Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 只有当搜索项为偶数时,二进制搜索才会创建infinte循环_Java_Infinite Loop_Binary Search - Fatal编程技术网

Java 只有当搜索项为偶数时,二进制搜索才会创建infinte循环

Java 只有当搜索项为偶数时,二进制搜索才会创建infinte循环,java,infinite-loop,binary-search,Java,Infinite Loop,Binary Search,对于我的类,我需要制作一个既使用二进制搜索又使用线性搜索的程序。线性搜索很好,所以我知道问题不在于所需的搜索项不存在 我试图找到答案,但这似乎是一个非常独特的问题 我正在从一个文件中读取一个图书列表,并将其放入存储标题和ID号的自定义图书类的数组中。我通过ID号搜索,只要ID号是奇数,它就可以正常工作;如果它是偶数,则会创建一个无限循环 这就是问题中的代码 private String binarySearch(String indexNumber){ int left, middle

对于我的类,我需要制作一个既使用二进制搜索又使用线性搜索的程序。线性搜索很好,所以我知道问题不在于所需的搜索项不存在

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

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

这就是问题中的代码

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;
}
私有字符串二进制搜索(字符串索引编号){
int左、中、右、比较;
字符串book=null;
左=0;
右=list.length-1;
while(左0){
右=中-1;
}否则{
左=中+1;
}
}
}
还书;
}

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

二进制搜索的问题在于它坚持查找匹配;否则,它根本不会退出


要解决此问题,请将
found==false
条件替换为
left二进制搜索的问题在于它坚持查找匹配项;否则,它根本不会退出


要解决此问题,请将
found==false
条件替换为
left当前,在找到某些内容之前,您无法退出循环。如果你最终没有找到结果,你希望发生什么?(提示:在循环条件中比较左右。摆脱
found
book
并在找到内容后立即返回。)顺便说一句
middle=(左+右)/2
可能溢出。您可以使用
middle=(左+右)>>>1相反。目前,在找到某些内容之前,您无法退出循环。如果你最终没有找到结果,你希望发生什么?(提示:在循环条件中比较左右。摆脱
found
book
并在找到内容后立即返回。)顺便说一句
middle=(左+右)/2
可能溢出。您可以使用
middle=(左+右)>>>1。这修复了无限循环,但由于某些原因,现在它不会返回我的新帐面值,而是返回while循环之前的空帐面值。@MRoffel尝试将
compare>0
替换为
compare<0
。当搜索值在右边时,您的代码似乎在左边。我尝试过,但肯定不是这样,因为当索引为奇数时,它仍然会正确返回,并且在我更改时根本不做任何事情it@MRoffel只是为了确保:
list
list[i]上排序。索引按升序排列,对吗?现在我查看它,我从未对它进行过显式排序,但我正在读取它的文本文件是按索引排序的。这修复了无限循环,但由于某种原因,现在它不会返回我的新书本值,而是返回while循环之前的空书本值。@MRoffel尝试将
compare>0
替换为
compare<0
。当搜索值在右边时,您的代码似乎在左边。我尝试过,但肯定不是这样,因为当索引为奇数时,它仍然会正确返回,并且在我更改时根本不做任何事情it@MRoffel只是为了确保:
list
list[i]上排序。索引按升序排列,对吗?我从来没有明确地对它进行排序,现在我看到了它,但是我从中读取它的文本文件是按索引排序的。
while (left <= right) {
    ...
    if (compare == 0) {
        book = list[middle].title;
        break;
    }
    ...
}