我遇到了一个数字教科书中的填充代码问题。所有的代码都是永久性的,不能更改,所以这个问题只能通过使用//Write code here区域来解决。
该问题要求实现removeOdd方法。
import java.util.Arrays;
public class RemoveTester
{
public static int removeOdd(int[] values, int size)
{
//Write code here
}
public static void main(String[] args)
{
int[] a = { 22, 98, 95, 46, 31, 53, 82, 24, 11, 19 };
int sizeBefore = 8;
int sizeAfter = removeOdd(a, sizeBefore);
System.out.print("a: [ ");
for (int i = 0; i < sizeAfter; i++)
{
System.out.print(a[i] + " ");
}
System.out.println("]");
System.out.println("Expected: [ 22 98 46 82 24 ]");
int[] b = { 23, 97, 95, 45, 31, 53, 81, 24, 11, 19 };
sizeBefore = 7;
sizeAfter = removeOdd(b, sizeBefore);
System.out.print("b: [ ");
for (int i = 0; i < sizeAfter; i++)
{
System.out.print(b[i] + " ");
}
System.out.println("]");
System.out.println("Expected: [ ]");
}
}
我尝试实现removeOdd的方法是:
int evenCount = 0;
for(int i = 0; i<size; i++){
if(values[i]%2==0){
evenCount++;
}
}
int[] newValues = new int[evenCount];
int newCount =0;
for(int i = 0; i<evenCount; i++){
if(values[i]%2==0){
newValues[newCount] = values[i];
newCount++;
}
}
values = newValues;
return evenCount;
当程序被编译和运行时,main会打印原始a或b数组的开头,而不是只打印a或b中的偶数元素。我找不到一种方法来将removeOdd方法中的原始数组更改为只包含偶数元素的新数组。我也想不出任何其他方法来做到这一点。如果有任何帮助,我将不胜感激!
3条答案
按热度按时间92vpleto1#
其他答案很好给予描述了您的总体方法存在的问题......也就是说,为什么您的结果不能返回到调用方法。
如果你的代码在其他方面都是正确的,你可以直接使用它,并在最后将结果复制回原始数组。事实上,你的逻辑中有一个缺陷。所以如果你修复了这个缺陷,然后在最后进行复制,你应该会得到正确的结果:
您可以使用相同的逻辑直接复制到原始数组中,而不必创建额外的数组来临时保存偶数值:
1tuwyuhd2#
由于Java是按值传递而不是按引用传递,因此设置
values
参数的值不会更改a
变量的值。你要做的就是从数组中删除所有的奇数元素,并将剩下的偶数元素左移,这样
a
的实际结果形式看起来就像这样:{22, 98, 46, 82, 24, 0, 0, 0, 0, 0}
lqfhib0f3#
正如@Geoff所指出的,Java是通过值传递的,这意味着当你将数组作为参数传递时,你在方法中得到的是对数组对象的引用,它不同于你在main方法中的原始引用
int[] a
因此,当执行values = newValues;
时,您将把用于指向与int[] a
相同对象的新引用指向newValues
所指向的数组对象,从而不更新原始数组a
,但实际上丢失了对它的任何引用。