以下是Robert Lafore撰写的“Java中的数据结构和算法”第二版。我们正在使用有序数组尝试在数组中插入一个项目。我通常喜欢在编码时理解线条,但这似乎让我感到懊恼。我理解上半部分在做什么 - 寻找把价值放在哪里。
现在从for(int k = nElems; k> j; k--)开始的第二部分是我被卡住的地方。 我认为这是它试图说的:将k设置为等于原始数组的大小并递减直到其k为大小为j。设置数组位置k等于k-1(或者可能是j-1?)然后...然后我陷入[j] =值;。
有人可以解释一下那里发生的事情吗?我以为数组一旦创建就是不可变的。人们会认为会创建一个全新的阵列。
public void insert(long value) // put element into array
{
int j;
for(j=0; j<nElems; j++) // find where it goes
if(a[j] > value) // (linear search)
break;
for(int k=nElems; k>j; k--) // move bigger ones up
a[k] = a[k-1];
a[j] = value; // insert it
nElems++; // increment size
}
答案 0 :(得分:2)
int k=nElems
从最后开始。
k > j
虽然我们还没有达到目标位置......
a[k] = a[k-1];
将当前元素向上移动一个位置。
k--
向左移动。
因此,将目标位置和结束位置之间的所有元素向右移动。
我认为数组一旦创建就是不可变的。
数组大小一旦创建就会被修复 - 任何索引处的元素都可以被修改或重新分配,但是你觉得合适。
这里可能做了什么 - 创建了一个更大的数组,并使用nElems
来表示填充值的数量 - 其余的索引只是null
。 Wikipedia's article on dynamic arrays简要提到了这一点 - 容量与 size 的概念 - 容量为a.length
,大小为nElems
。这与ArrayList
的工作方式相同。
答案 1 :(得分:0)
在插入之前移动现有元素以为新元素腾出空间