Java 如果该方法的参数是以前设置的变量而不是直接输入的,为什么该方法返回不同的值?
以下是我课程的相关部分 主要方法的相关部分Java 如果该方法的参数是以前设置的变量而不是直接输入的,为什么该方法返回不同的值?,java,arrays,Java,Arrays,以下是我课程的相关部分 主要方法的相关部分 int[] C = createIntArray_descending(); int found, target, from, to; int[] array; array = C; target = 5; from = array[0]; to = array[array.length-1]; printArray(array); bubble_sort(array);
int[] C = createIntArray_descending();
int found, target, from, to;
int[] array;
array = C;
target = 5;
from = array[0];
to = array[array.length-1];
printArray(array);
bubble_sort(array);
printArray(array);
found = searchAscending(target, array, from, to);
found = searchAscending(5, C, C[0], C[C.length-1]);
System.out.println(found);
方法searchAscending(),一种二进制搜索方法
public static int searchAscending(int target, int[] array, int from, int to) {
int mid = (from + to)/2;
if (to<from)
return -1;
else if (target == array[mid])
return mid;
else if (to == from)
return -1;
else if (target < array[mid])
return searchAscending(target, array, from, mid-1);
else
return searchAscending(target, array, mid+1, to);
}
该方法返回4,这意味着5实际上在位于位置4的数组C中。然后我想将它推广到其他数组,所以我创建了变量target、from、to和一个空的int数组,然后我可以使用
found = searchAscending(target, array, from, to);
但是,当我使用此行而不是前一行运行程序时,该方法返回-1(意味着它没有在数组中找到目标5)
为什么它们返回不同的值?在我看来,它们基本上是一样的
编辑:
我发现问题来自于行中的变量
found=searchAscending(目标,数组,数组[0],数组[array.length-1])
工作正常,因此成功地传递了值,但
(target、array、from、array[array.length-1])
给出了ArrayIndexOutOfBoundsException…因此无论我以何种方式调用它,我都会得到相同的答案。然而,我注意到了一个关于如何调用二进制搜索函数searchAscending的问题。对于往返者,都使用索引处的值来调用它,而不是索引本身。为您的主要目标尝试以下方法:
int[] C = createIntArray_descending();
int found, target, from, to;
int[] array;
array = C;
target = 5;
from = 0;
to = array.length-1;
printArray(array);
bubble_sort(array);
printArray(array);
found = searchAscending(target, array, from, to);
System.out.println(found);
found = searchAscending(5, C, 0, C.length-1);
System.out.println(found);
首先,我将假设
createIntArray\u descending()
创建数组{5,4,3,2,1}
,并且bubble\u排序(数组)
将其正确排序为{1,2,3,4,5}
您的主要问题是from
和to
是索引,但是您要从数组中传入值
还要注意的是,array=C
对代码没有意义,因为它不会复制数组<代码>数组和C
引用同一数组
要解释它不起作用的原因,请使用调试器并检查代码的值:
int[] C = createIntArray_descending(); // C = {5,4,3,2,1}
array = C; // array = {5,4,3,2,1}
target = 5;
from = array[0]; // from = 5
to = array[array.length-1]; // to = 1
printArray(array);
bubble_sort(array); // array = C = {1,2,3,4,5}
printArray(array);
found = searchAscending(target, array, from, to); // (5, C, 5, 1) -> found = -1
found = searchAscending(5, C, C[0], C[C.length-1]); // (5, C, 1, 5) -> found = 4
System.out.println(found);
在对
searchAscending()
的两次调用中,您应该使用from=0
和to=4
进行调用。两个电话都不正确。请提供真实的电话号码。您只是在描述导致失败的代码!bubble\u sort
方法的作用是什么?这似乎涉及到array
而不是C
,可能是问题的根源。当参数显然是索引时,为什么要将值从和传递给参数<代码>搜索升序(5,C,C[0],C[C.length-1])
应该是搜索升序(5,C,0,C.length-1)
。请注意,array=C
不会复制数组,因此调用bubble\u sort()
之前的C[0]
可能与调用bubble\u sort()
之后的C[0]
不一样,考虑到array
和C
引用的是同一个数组?@Sasang似乎不管它对数组做了什么,都会关心您报告此代码的一些单独问题?因为这并没有真正解决海报声称要观察到的问题。我想是的。但是我相信这是他们遇到的实际问题,因为这两个调用应该,并且在我的测试中,返回相同的东西。显然,我们将不得不等到它全部通过Google Translate:)我很困惑。。to和from应该是索引处的值,它们表示数组中最低的数字,以及排序后最高的数字。编辑:它确实按照你建议的方式工作,但我不清楚它是在做我想做的事情还是在做其他事情?像你现在使用的那样使用二进制搜索,你是在根据索引位置进行搜索。因此,to和from也需要是索引。如果列表中的每一项都与它的索引值相同,那么它可能会偶尔工作。
int[] C = createIntArray_descending(); // C = {5,4,3,2,1}
array = C; // array = {5,4,3,2,1}
target = 5;
from = array[0]; // from = 5
to = array[array.length-1]; // to = 1
printArray(array);
bubble_sort(array); // array = C = {1,2,3,4,5}
printArray(array);
found = searchAscending(target, array, from, to); // (5, C, 5, 1) -> found = -1
found = searchAscending(5, C, C[0], C[C.length-1]); // (5, C, 1, 5) -> found = 4
System.out.println(found);