如何在数组末尾添加参数?

时间:2011-04-06 23:32:52

标签: java arrays

我正在处理这个表示整数列表的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];
}

6 个答案:

答案 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类的实现进行一些更改:

  • 将“count”实例变量添加到NumberList类,该类表示列表中的整数数。如果要分配比当前整数更长的数组,例如,这将非常有用。你最初可以有一个长度为10的数组但是有count == 0
  • 然后,如果你想添加一个新的整数并且仍然在数组中有空格,你需要做的就是将整数放在数组中的正确位置并进行计数++
  • 当您需要重新分配数组时(例如,当您尝试添加新整数时,如果count == array.length),那么您应该使新数组更大一些,例如加倍前一个数组的大小。这将避免在添加每个整数时重新分配数组。
  • 使用System.arraycopy将旧数组值复制到新数组中(长度等于“count”)

答案 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]; 

}