如何覆盖数组中的位置?

时间:2013-09-07 20:42:01

标签: java arrays

我有一个使用具有特定数量的地点的数组的方法。我要求用户输入要开始覆盖的地点编号。我的对象数组在地方有其他对象。我不确定我对j变量的处理是否正确。以下是我在地方移动物体的方法。

public void overwriteArray(int number) {
  for (int i=0; i<array.length ; i++) {
    if (i ==(number-1) {
      for(int j = i ; j<array.length ; j++) {
        array[j] = array[j+1];
      }
    }
  }
}

还有其他方法吗?有没有比使用数组更容易的东西?移动数组中对象的方式是否正确? 谢谢!

2 个答案:

答案 0 :(得分:0)

你的外循环遍历孔数组并仅在i == (number-1)时执行内循环,因此迭代的array.length - 1是免费的!

您可以使用if (i ==(number-1) {删除外部for循环,而是编写for(int j = (number-1) ; j<array.length ; j++) {

array[j+1];也会在最后一次迭代中给你一个ArrayIndexOutOfBoundsException。也许你只想去array.length - 1

另外,要避免ArrayIndexOutOfBoundsException,您应确保number在迭代前的[1, array.length]范围内。

以下是如何看起来:

@Test
public void overwritearrayay() {
    String[] array = {"foo", "bar", "foobar"};
    log(Arrays.toString(array));
    overwritearrayay(array, 1);
    log(Arrays.toString(array));
}

public void overwritearrayay(String[] array, int n) {
    if(n > 0 && array != null && n <= array.length) {
        for(int i = n-1; i < array.length-1; i++) {
            array[i] = array[i+1];
        }
        array[array.length-1] = null;
    }
}

public static void log(String string) {
    System.out.println(string);
}

<强>输出

[foo, bar, foobar]
[bar, foobar, null]

答案 1 :(得分:0)

如果我理解得很好:你想删除number输入参数描述的元素,并将剩余的元素移到左边。此外,最后的元素保持在所有移动的位置。 number是要删除的元素的编号,因此 1 表示要删除第一个元素,这意味着数组中的** **为0 **我是对的吗?

然后你的代码似乎工作正常,除了你不需要外部循环。完全:

public void overwriteArray(int number) {
  for(int j = number-1 ; j<array.length ; j++) {
    array[j] = array[j+1];
  }
}

外部循环没有做任何事情,除非循环变量是exactlz number-1另外要注意,这可能会在数组长度之外解决...

您也可以将System.arraycopy用于此目的,不需要这个长度代码(索引可能已关闭,当然它会因不正确的number参数而死亡):

public void overwriteArray(int number) {
    System.arraycopy(array, number, array, number-1, array.length-number);
}

在同一个src和dest上工作。

  

如果src和dest参数引用相同的数组对象,则执行复制,就好像位置srcPos到srcPos + length-1的组件首先被复制到具有长度组件的临时数组,然后是临时数组被复制到目标数组的destPos + length-1的destPos位置。