Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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二进制搜索,高值抛出异常_Java_Search_Binary_Indexoutofboundsexception - Fatal编程技术网

Java二进制搜索,高值抛出异常

Java二进制搜索,高值抛出异常,java,search,binary,indexoutofboundsexception,Java,Search,Binary,Indexoutofboundsexception,在阅读了教科书页面上的示例之后,我正在尝试实现递归二进制搜索 在大多数情况下,我的算法似乎运行良好,但对于高于数组中最高值的值,我会得到一个ArrayIndexOutOfBoundsException。看看我的算法和教科书上的例子,它们看起来是一样的;有人能帮我找到哪里出了问题吗 我知道这与中的问题基本相同,我已经考虑过它提出的解决方案。然而,示例代码并没有实现像这样的参数更正,我想知道为什么没有它它就可以工作 public static int binarySearch(int[] a

在阅读了教科书页面上的示例之后,我正在尝试实现递归二进制搜索

在大多数情况下,我的算法似乎运行良好,但对于高于数组中最高值的值,我会得到一个
ArrayIndexOutOfBoundsException
。看看我的算法和教科书上的例子,它们看起来是一样的;有人能帮我找到哪里出了问题吗

我知道这与中的问题基本相同,我已经考虑过它提出的解决方案。然而,示例代码并没有实现像这样的参数更正,我想知道为什么没有它它就可以工作

    public static int binarySearch(int[] array, int item, int lowPos, int highPos){
    if (lowPos > highPos){
        return -1;
    }

    int mid = (lowPos + highPos)/2;

    if (array[mid] == item){
        return mid;
    }else if (array[mid] > item){
        return binarySearch(array, item, lowPos, mid-1);
    }else{
        return binarySearch(array, item, mid+1, highPos);
    }
}
这是教科书上的例子,显然不会产生错误:

    static int binarySearch(int[] A, int loIndex, int hiIndex, int value) {

   if (loIndex > hiIndex) {
         // The starting position comes after the final index,
         // so there are actually no elements in the specified
         // range.  The value does not occur in this empty list!
      return -1;
   }

   else {
         // Look at the middle position in the list.  If the
         // value occurs at that position, return that position.
         // Otherwise, search recursively in either the first
         // half or the second half of the list.
      int middle = (loIndex + hiIndex) / 2;
      if (value == A[middle])
         return middle;
      else if (value < A[middle])
         return binarySearch(A, loIndex, middle - 1, value);
      else   // value must be > A[middle]
         return binarySearch(A, middle + 1, hiIndex, value);
   }

} // end binarySearch()
静态int二进制搜索(int[]A,int loIndex,int hiIndex,int value){
如果(loIndex>hiIndex){
//起始位置在最终索引之后,
//因此,在指定的元素中实际上没有元素
//范围。该值不在此空列表中出现!
返回-1;
}
否则{
//查看列表中的中间位置。如果
//值出现在该位置,返回该位置。
//否则,在第一个
//单子的一半或后半部分。
中间整数=(loIndex+hiIndex)/2;
如果(值==A[中间])
返回中间;
else if(值
您的代码很好,只是输入的值不正确。您可能使用了错误的highPos来启动方法,如果是这种情况,请使用myArray.length-1而不是myArray.length

否则,您为修改后的方法调用的参数完全错误,可能会切换值。调用代码应该如下所示

binarySearch(myArray, myIntToSearchFor, 0, myArray.length-1)

您的代码很好,只是错误地传递了值。您可能使用了错误的highPos来启动方法,如果是这种情况,请使用myArray.length-1而不是myArray.length

否则,您为修改后的方法调用的参数完全错误,可能会切换值。调用代码应该如下所示

binarySearch(myArray, myIntToSearchFor, 0, myArray.length-1)


我相信你传递的是
array.length
而不是
array.length-1
作为
highPos
的参数,我相信你传递的是
array.length
而不是
array.length-1
作为
highPos

的参数,你有什么例外?你能发布stacktrace吗?@LuiggiMendoza他说他得到了一个越界异常。无法复制该行为。你能发布引起错误的代码吗(太懒了,太想看了)?我想你可能放错了参数。我唯一能得到的是你用错误的方式发送参数。请注意,book方法使用数组、低索引、高索引和值,而您的方法使用数组、值、低索引和高索引。这意味着,当从您的客户端类/方法调用
binarySearch
方法时,例如
publicstaticvoidmain(String[]args)
.OP,您能告诉我们谁是对的吗?;)你有什么例外?你能发布stacktrace吗?@LuiggiMendoza他说他得到了一个越界异常。无法复制该行为。你能发布引起错误的代码吗(太懒了,太想看了)?我想你可能放错了参数。我唯一能得到的是你用错误的方式发送参数。请注意,book方法使用数组、低索引、高索引和值,而您的方法使用数组、值、低索引和高索引。这意味着,当从您的客户端类/方法调用
binarySearch
方法时,例如
publicstaticvoidmain(String[]args)
.OP,您能告诉我们谁是对的吗?;)这很可能就是问题所在。然而,由于我没有看到发布的调用代码(或者可能是“您可能正在通过”),您是否正在通过一个魔镜查看?如果你是对的,随机猜测是值得称赞的。代码是正确的,所以消除过程我不这么认为。请参阅我对OP问题的最后评论。顺便说一下,我想知道你是如何消除一些你以前从未见过的东西的:)。但是他正确地切换了调用方法的方式来解释这一点。所以这不是问题所在。代码很好,他对方法的调用是notYou's right,这是另一种可能的解释,所以我修改了我的答案以反映这一点。但问题肯定是他如何调用方法,而不是方法代码本身。这很可能是问题所在。然而,由于我没有看到发布的调用代码(或者可能是“您可能正在通过”),您是否正在通过一个魔镜查看?如果你是对的,随机猜测是值得称赞的。代码是正确的,所以消除过程我不这么认为。请参阅我对OP问题的最后评论。顺便说一下,我想知道你是如何消除一些你以前从未见过的东西的:)。但是他正确地切换了调用方法的方式来解释这一点。所以这不是问题所在。代码很好,他对方法的调用是notYou's right,这是另一种可能的解释,所以我修改了我的答案以反映这一点。但问题肯定是他如何调用方法,而不是方法代码本身。