我不确定如何使这个方法按下项目而不是覆盖它们。现在,如果我有一个包含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();
答案 0 :(得分: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
答案 1 :(得分:1)
问题在于你的替代:
array[j + 1] = array[j];
举个例子:如果您使用的是j = 0
,那么您可以使用array[1]
中的值替换array[0]
然后在循环的下一步中,将array[2]
的值替换为array[1]
的值,该值已替换为array[0]
的值。
您应该从头到尾处理您的数组(将j
从array.length
减少到j=i
),您应该没问题。
答案 2 :(得分:1)
你正在推动改变的指数。
“array [j + 1] = array [j];” 更改数组[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.
答案 3 :(得分: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]