我有一个使用具有特定数量的地点的数组的方法。我要求用户输入要开始覆盖的地点编号。我的对象数组在地方有其他对象。我不确定我对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];
}
}
}
}
还有其他方法吗?有没有比使用数组更容易的东西?移动数组中对象的方式是否正确? 谢谢!
答案 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位置。