0

我有一个使用具有一定数量位置的数组的方法。我要求用户输入要开始覆盖的地方编号。我的对象数组在本地有其他对象。我不确定我对 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];
      }
    }
  }
}

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

4

2 回答 2

0

您的外循环迭代孔数组并仅当迭代是免费的时才执行i == (number-1)内循环!array.length - 1

您可以摆脱外部 for 循环以及 the if (i ==(number-1) {,而是编写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]
于 2013-09-07T20:57:09.593 回答
0

如果我理解得很好:您要删除number输入参数所描述的元素,并将剩余的元素向左移动。此外,最后的元素在所有移动中都保持原位。而 number 是要删除的元素的编号,所以1表示要删除的第一个元素,即数组中 0 的**索引,对吗?

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

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

外部循环没有做任何事情,除非循环变量是exactlznumber-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。

于 2013-09-07T21:01:13.560 回答