在数组开头添加元素。

3
我正在练习一些相当基础的Java数组练习,但我很难理解如何将元素插入到数组开头并将其余元素向右移动。因此,如果数组没有超过其最大大小,在数组 j,a,v,a 的前面插入 z,就会变成 z,j,a,v,a。
我知道如何使用ArrayList实现这个功能,但是对于数组,我仍然很难掌握正确的逻辑。以下是我的进展情况:
 public void addFront(char ch)
 {
   for(int i = 1; i < data.length-1; i++){
     char temp = data[i - 1]; 
     data[i] = temp; 
   }
   data[0] = ch; 

 }

在这种情况下,似乎我需要一个临时变量,但我使用它不正确。欢迎任何意见!


我知道使用ArrayList的处理方法,但是我正在练习只使用数组,并且试图揣摩这个如何在数组中实现。 - user3029486
1
@nhgrif 为什么不用Array呢? - Michael Yaworski
3个回答

2
让我们看一下您当前的循环在做什么。它正在将字符从位置i-1复制到当前位置。但下一个循环将把它从(当前)i复制到(当前)i+1。它只会在数组中的每个位置上复制第一个字符,除了最后一个位置。
您必须反向迭代整个数组,以便一个移位不会意外地使用先前移位的结果。
从索引data.length-1开始,并从位置i-1复制到位置i,确保最后一次迭代是i1时。
此外,不需要临时变量。您可以直接复制该值,即:
data[i] = data[i - 1];

1
从数组的末尾开始。
如果您将元素0移动到元素1,然后将元素1移动到元素2……那么您已经复制了元素0到元素1……所以现在您只需将元素0复制到整个数组中。
从数组的末尾开始向右移动所有内容,然后完成此操作后,在前面插入新元素。
public void addFront(char ch) {
    for(int i = data.length-1; i > 0; --i) {
        data[i] = data[i-1];
    }
    data[0] = ch;
}

0

你不需要一个临时变量来进行插入,按照描述应该可以工作...

public void addFront(char ch)
{
  for(int i = data.length - 1; i > 0; i--){ // start at the end.
     data[i] = data[i-1]; // move every element up 1... that is set the current 
                          // element to the prior element.
  }
  for (int i = data.length - 1; i >= 0; i--) {
    if (data[i] == null) { // find the first blank...
      data[i] = ch;  // set the initial value.
      break;
    }
  }
}

为什么我们要两次遍历整个数组? - nhgrif
@nhgrif 我不确定我们是从0开始的...问题有点含糊...显然这假设数据是一个Character[] - Elliott Frisch
如果你想这样做,那没问题。但我还是不明白为什么我们要迭代两次?为什么不在第一次循环中遇到空值(移动后)后直接使用 data[i] = ch; 呢? - nhgrif
一个循环:for(/*stuff*/){ data[i] = data[i-1]; if(data[i] == null) { data[i] = ch; break; } } - nhgrif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接