0

我不确定如何使此方法将项目向下推送而不是覆盖它们。现在,如果我有一个包含 10 个项目的数组:

[0] = zero
[1] = one
[2] = two
...
[10] = ten 

我在索引 [2] 处插入一个项目,发生的情况如下:

[0] = zero
[1] = one
[2] = two
[3] = two
[4] = two
 ...  
[10] = two 

它覆盖选定索引之后的所有项目,而不是按索引将它们下推。为什么会发生这种情况,我该如何解决?谢谢。

public void insert(int i, String s) {

if (array[i] == null) {
    array[i] = s;spot on the list.
} else { 
    for (int j = i; j < array.length - 1; j++) {
        array[j + 1] = array[j]; 

        if (j == array.length - 1) { 
            break;
        } 
    }
    array[i] = s;
    extendArray();
4

4 回答 4

2

如果你想“推送”项目而不是“覆盖”它们,那么你不应该使用数组,这项工作更容易使用ArrayList

List<Integer> lst = new ArrayList<Integer>();
lst.add(1);
lst.add(3);
lst.add(4);
lst.add(1, 2); // "push" the elements to the right, making room for 2

在上面的例子中,最后lst将包含1, 2, 3, 4

于 2013-11-13T15:47:30.370 回答
1

问题在于您的替换:

 array[j + 1] = array[j]; 

举个例子:如果你是,j = 0那么你用Then 中array[1]的值替换,array[0] 然后在循环的下一步中,你将 的值替换为 的值,array[2]该值array[1]已被 的值替换array[0]

你应该从最后开始处理你的数组(jarray.lengthto减少j=i),你应该没问题。

于 2013-11-13T15:45:21.703 回答
1

您正在推动更改的索引。

"array[j + 1] = array[j];" 在你改变了 array[j] 之后(在 for 循环的开始, == 到 array[i] )。

但是看看这个:

ar = [1,2,3]

插入位置 1 意味着我将设置 ar[2]=ar[1]。

怎么做?拉而不是推。使循环从 array.length-1 下降到要更改的索引。

//check if you need to grow the array first.
for (int j = array.length-1; j > i; j--) {
    array[j] = array[j-1]; 
}
//and now insert.
于 2013-11-13T15:48:07.660 回答
0

您可以更改 for 循环条件

for (int j = i; j < array.length - 1; j++) {

            array[j + 1] = array[j]; 

for(int j=array.length-2;j>=i;j--){

            array[j + 1] = array[j];

通过此更改,控制台中将显示以下信息:

[zero, one, two, two, three, four, five, six, seven, eight, nine]
于 2013-11-13T15:56:00.623 回答