我正在处理这个表示整数列表的NumberList类。 NumberList对象只有一个实例变量,它是对int值数组的引用。我需要实现的方法之一是将参数添加到列表的末尾:
a)创建另一个比现有单元大一个单元的数组
b)将现有阵列中的所有元素复制到新阵列
c)将参数添加到新数组的末尾
d)重新分配实例变量“values”,使其引用新数组。
这是我的尝试。没有错误,但我觉得它是不正确的,尤其是我尝试将数字添加到anotherArray末尾的部分。我引用的参数是“number”,一个int
public void add(int number) {
int[] anotherArray;
int newLength = values.length + 1;
anotherArray = new int[newLength];
for (int i = 0; i <values.length; i++)
values[i] = anotherArray[i];
for (int i = 0; i < anotherArray[i]; i++)
anotherArray[i] += number;
values = new int[anotherArray.length];
}
答案 0 :(得分:4)
首先,你已经完成了任务。它应该是这样的:
for (int i = 0; i < values.length; i++)
anotherArray[i] = values[i];
这会将从{/ 1>} values
分配给 anotherArray
。其次,您希望设置 anotherArray
中的新值,如下所示:
anotherArray[newLength - 1] = number;
最后,
values = anotherArray;
这是使用System.arraycopy
编写代码的另一种方法:
public void add(int number) {
int[] anotherArray = new int[values.length + 1];
System.arraycopy(values, 0, anotherArray, 0, values.length);
anotherArray[values.length] = number;
values = anotherArray;
}
答案 1 :(得分:0)
您不需要两个for
循环来执行此操作,因为您只需要将旧数组中的元素复制到新数组中一次。
您也不想values = new int[anotherArray.length];
,因为这实际上是声明了一个没有设置值的新数组。
逻辑应该类似于:
newArray = new Array[old_length + 1];
for ( i from 0 to old_length ) {
newArray[i] = values[i];
}
newArray[old_length] = new_element
values = newArray
答案 2 :(得分:0)
看起来在大多数情况下,你是在正确的轨道上,但是当你试图添加到新阵列的末尾时它开始脱轨......
据我所知,你所需要的只是......
`public void add(int number){ int [] anotherArray; int newLength = values.length + 1;
anotherArray = new int[newLength];
for (int i = 0; i <values.length; i++)
anotherArray[i] = values[i];
anotherArray[newLength-1] = number;
values = anotherArray.length;
} `
答案 3 :(得分:0)
我建议对NumberList类的实现进行一些更改:
答案 4 :(得分:0)
查看算法中的b,c和d部分,并仔细比较它们的代码。
第一个for循环执行b部分。但是将您的代码与“将现有阵列中的所有元素复制到新阵列”中的语句进行比较。那是你的代码在做什么的?不完全,但差不多。您的代码将新数组中的值分配给现有数组。
现在想想c部分的陈述。这需要循环吗?不,不是的。但首先,让我们讨论这个循环的错误,作为一个学习练习。首先,它可能会生成IndexOutOfBoundsException,因为您的循环条件为i < anotherArray[i]
。数组中的值与它们的大小无关,因此如果所有值都很大,i
将超过数组的末尾。另外,为什么要为每个元素添加number
?
现在,至于修复它,请看一下声明c。它说要将它添加到新数组的末尾。在此上下文中(以及涉及数据结构的所有上下文中),“add”表示“insert”而不是“+”。你创建了一个带有一个额外元素的新数组;该元素当前为空。这个新元素最后,需要保留number
。
最后,你的最后一个语句只是让values
指向一个新的空数组。相反,您应该将values
参考点指向您已创建并填充值的数组。
答案 5 :(得分:0)
你不需要第二个for循环,你只需要在数组的最后一个位置添加最后一个数字。
public void add(int number) {
int[] anotherArray;
int newLength = values.length + 1;
anotherArray = new int[newLength];
for (int i = 0; i <values.length; i++)
values[i] = anotherArray[i];
//for (int i = 0; i < anotherArray[i]; i++)
anotherArray[anotherArray.lenth-1] = number;
values = new int[anotherArray.length];
}