Java:d​​elete / pack方法,有人可以解释吗?

时间:2018-09-20 12:16:58

标签: java

有人可以向我解释这种方法的工作原理吗?我不明白它们如何在数组中移动以删除项目索引。

private void pack(int index) {.
    for(int i =index; i<noOfItems-1; i++)
        theItems[i]=theItems[i+1];
    noOfItems--;
}

4 个答案:

答案 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来计算数组的末尾,因此不再可见。