1

我进行了不错的搜索,但无法找到向下移动数组的工作代码。我希望做的是将值存储在数组的最后一个位置,替换最后一个位置,然后将数组 [20] 移动到数组 [19]。这是为了计算玩家最后的 20 次移动,但我在实际存储时遇到了麻烦。这就是我试图做的

//an int moveArray[20] previously stated and instantiated
int temp1, temp2;

for (int i = moveArray.length - 1; i > 0; i--) 
{
     temp1 = moveArray[i - 1];
     temp2 = moveArray[i - 2];
     moveArray[i - 1] = moveArray[i];
     temp1 = temp2;
}
moveArray[moveArray.length - 1] = intoWalk;

任何建议或解决方案都会有帮助,谢谢

4

4 回答 4

4

根据我对您的代码的理解。您应该使用以下循环,似乎不需要临时变量。

for(int i=0;i<moveArray.length-1;i++){ 
     moveArray[i] = moveArray[i+1];
}
moveArray[moveArray.length - 1] = intoWalk;
于 2013-05-22T05:25:26.970 回答
3

首先,您不需要使用临时变量:

int [] moveArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
int intoWalk = 21;

for (int i = 0; i < moveArray.length-1; i++) {
    moveArray[i] = moveArray[i+1];
}
moveArray[moveArray.length - 1] = intoWalk;

for (int i=0; i<moveArray.length; i++)
    System.out.println(moveArray[i]);

但是有一个更好的方法来做到这一点:使用链表来模拟 FIFO:

LinkedList<Integer> fifo = new LinkedList<Integer>();
int intoWalk = 21;

for (int i=1; i<=20; i++)
    fifo.add(i);

fifo.removeFirst();
fifo.add(intoWalk);

for (Integer fifoItem : fifo)
    System.out.println(fifoItem);

通过这样做,您不必在每次要添加数字时修改数组中的每个元素,只需在链表中添加和删除项目即可。

于 2013-05-22T05:40:38.080 回答
0
//an int moveArray[20] previously stated and instantiated
int temp1, temp2;
temp1 = moveArray[moveArray.length - 1];
for (int i = moveArray.length - 2; i >= 0; i--) 
{
    temp2 = moveArray[i];
    moveArray[i] = temp1;
    temp1 = temp2;
}

moveArray[moveArray.length - 1] = intoWalk;

以上应该做你想要的。

但是,我认为这不是正确的方法。

我会使用与循环数组相同的数组 - 这样 - 你不需要每次都向下移动。

维护起始索引。它开始于

start = 0;

它一直保持0到所有 20 个元素都被填满为止。当下一个元素进来时,

moveArray[start] = intoWalk;
++start;

当您想随时遍历数组时,请从 开始start而不是从 开始0

int i = start;
do
{
    // do what you want

    i = (i + 1)%20; 

} while (i != start);
于 2013-05-22T05:23:39.480 回答
0

首先通过将所有元素向下移动一行来释放最后一个元素。

样本 :

String[] sarr=new String[10];
for(int i=0;i<sarr.length;i++){
   sarr[i]=sarr[i+1];
}

然后将新变量分配到末尾。

sarr[sarr.length-1]="new value";

这种方法更简单,更易读。

编辑:是的 Bohemian 是正确的,它抛出了 ArrayIndexOutOfBounds 异常。原因是i+1它将尝试在最后一次迭代中引用数组范围之外的索引。

解决方案是将最后一个元素设置为 null 或在它是最后一个元素时中断。

我将把最后一个元素设置为空。更改后的代码如下。

int nextElementIndex = i + 1;
sarr[i] = nextElementIndex < sarr.length ? sarr[nextElementIndex] : null;
于 2013-05-22T05:25:47.410 回答