有人可以向我解释这种方法的工作原理吗?我不明白它们如何在数组中移动以删除项目索引。
private void pack(int index) {.
for(int i =index; i<noOfItems-1; i++)
theItems[i]=theItems[i+1];
noOfItems--;
}
答案 0 :(得分:0)
它只是将所有元素从给定的索引开始向上移动一个位置。
之后,它将减少数组中元素的数量。
例如,使用参数4调用方法,将索引5的元素的值移至索引4的元素。将索引6的元素的索引移至索引5,以此类推。
因此,如果您首先拥有数组
45, 78, 1, 45, 234, 856, 4323, 87
,之后您已经
45, 78, 1, 45, 856, 4323, 87
答案 1 :(得分:0)
他们正在将数组的下一个值写入其中,并减小了数组的大小。
例如,
int a[] = new int[] {1,2,3,4,5}
如果我叫pack(2)
,那么打印a的输出是
{1,2,4,5,5}
答案 2 :(得分:0)
我不明白它们如何在数组中移动以删除项目索引。
他们没有。 Java数组的大小是固定的,因此该代码仅复制从index
开始直到一个元素剩下的noOfItems
的所有项目,然后记录该数组所保存的项目数减少了一个事实
这里是一个例子:假设您从这个十元素数组开始
0 1 2 3 4 5 6 7 8 9
A B C D E F G H _ _
^
|
last item
现在,您希望删除索引4处的项目。算法将按如下所示变换数组:
0 1 2 3 4 5 6 7 8 9
A B C D F G H H _ _
^
|
last item
请注意,索引7处的项目已复制,但未删除。它的内容并不重要,因为它已经超过了最后一项(即noOfItems
)的位置。
在某些情况下,这将是有问题的-具体来说,当阵列的“死”部分中有大对象时,它们可能会“徘徊”过去,直到有资格进行垃圾收集为止。
答案 3 :(得分:0)
从索引开始,每个值都将移到数组的开头。
theItem[index] = theItem[index+1];
theItem[index+1] = theItem[index+2];
由于索引处的值永远不会写入新位置,因此不再可以访问。
最后,noOfItems
递减1,因为现在数组中的元素减少了一个。
在带有[1,2,3,4,5,6]
的数组noOfItems = 6
上,调用pack(4)将会发生以下情况:
[1,2,3,5,5,6]
[1,2,3,5,6,6]
noOfItems = 5
数组中的最后一个6
并没有消失,但是由于其他所有代码(我想)都在使用noOfItems
来计算数组的末尾,因此不再可见。