我的方法应该返回数组未排序部分中最大元素的位置,方法的第二个参数指定数组未排序部分结束的最大索引。我的testMaxPositionMiddle通过,但我的testMaxPositionFirst失败,我不明白为什么。
public Object maxPosition(int[] array, int x)
{
for( int i = 0; i < array.length - 1; i++)
{
int maxPosition = i;
for( int j = 0; j < array.length; j++)
{
if(array[j] > array[maxPosition])
{
maxPosition = j;
return maxPosition;
}
}
}
return null;
}
@Test
public void testMaxPositionMiddle()
{
int[] x = { 1, 5, 3, 7, 8, 9};
MySorter s = new MySorter();
assertEquals(1, s.maxPosition(x,2));
@Test
public void testMaxPositionFirst()
{
int[] x = {5, 1, 3, 2, 8, 9};
MySorter s = new MySorter();
assertEquals(0, s.maxPosition(x, 3));
}
答案 0 :(得分:1)
您的代码中有三个错误。
第一个是你实际上在整个数组中检查maxvalue而不是检查0 ..... x之间的值。因此,您应该将循环更改为不循环遍历整个数组,但仅限于开头:
for(int i = 0; i <= x; i++){
}
你的第二个问题是,当你只需要一个循环时,你正在运行2个循环:检查最大值的循环。首先假设最大值是第一个(0)位置的值,然后每次找到更大的值时更新maxvalue。首先给maxPosition赋值0,作为循环前的起始值。
int maxPosition = 0;
你的第三个问题是,如果第一个位置(0)实际包含正确的值,则maxPosition应该为0.
if(array[j] > array[maxPosition]){
maxPosition = j;
return maxPosition;
}
在这些行中,如果 更新,您将返回正确的maxPosition 。如果maxPosition为0,它将永远不会更新,然后你永远不会到达这一行:
return maxPosition;
相反,您将在函数末尾找到return语句,而是返回 null ,如下所示:
return null;
实际上你的代码甚至还有第四个错误。在此状态下,您将返回任何值,该值在开头大于maxPosition。
例如,如果您有一个列表(2,4,6),那么maxPosition在开始时将为0。 maxValue将是2,但这些代码行:
if(array[j] > array[maxPosition]){
maxPosition = j;
return maxPosition;
}
即使在值数组[1]&gt;的第二种情况下,实际上会让你跳转到if语句中array [maxPosition],因为4> 2。因此,您的代码将返回maxPosition 1
你想要做的是从if语句中删除return语句,并且只为你的函数提供一个 return语句。这应该是在for-loop
之后的总函数的末尾