Java数组向第一个添加新值并删除最后一个

时间:2015-01-29 10:23:21

标签: java arrays push

我正在尝试更新我的数组,所以如果你向第一个数组尾部添加一些东西[0]整个数组更新并移动1到下一个,最后一个尾部[49]被移除。

因此,如果我向tail [0]添加一个值,我希望tail [1]得到旧尾[0]值,tail [2]得到旧尾[1]值和尾[3]得到旧尾[2]的价值。旧尾[3]的价值将被删除。这就像一个数组推送,每次都删除最后一个值。

到目前为止我尝试了这个,但我无法让它发挥作用。

创建数组:

Tail[] tail = new Tail[50];

为整个数组赋值:

for(int i = 0; i < tail.length; i++){
    tail[i] = new Tail(0,0);
}

更新数组,以便添加新值并删除最后一个值。

public void tail(){

    tail[0] = new Tail(ball.getX(),ball.getY());

    for(int i = 1; i < tail.length; i++){
        tail[i] = new Tail(tail[i-1].x,tail[i-1].x);
    }
}

尾巴课程:

public class Tail {

    public float x;
    public float y;

    ShapeRenderer shapeRenderer;
    SpriteBatch batch;

    public boolean active = false;

    public Tail(float x, float y){
        shapeRenderer = new ShapeRenderer();
        batch = new SpriteBatch();

        this.x = x;
        this.y = y;

          batch.begin();
          shapeRenderer.begin(ShapeType.Filled);
          shapeRenderer.circle(x, y, 16);
          shapeRenderer.setColor(Color.BLACK);
          shapeRenderer.end();
          batch.end();  

        Gdx.app.log("TailX"+x, "TailY"+y);
    }

}

尾部空洞最终导致我的游戏失败,这是解决这个问题的最佳方法吗?

5 个答案:

答案 0 :(得分:1)

不要使用数组这样的东西 - 改用堆栈。

答案 1 :(得分:1)

尝试以下代码(已更新)

public void tail(){

    float tempx = ball.getX();
    float tempy = ball.getY()

    for(int i =(tail.length - 1); i > 0; i--){
        tail[i].x = tail[i-1].x;
        tail[i].y = tail[i-1].y;

    }
    tail[0].x = tempx;
    tail[0].y = tempy;
}

答案 2 :(得分:1)

首先,当您尝试移动尾部时,您似乎正在创建新的Tail。有什么理由吗?您应该只需移动引用即可重复使用相同的实例。

此外,在您的代码中,您尝试在移动所有其他元素之前在位置0,处插入新元素。你需要反过来做,以确保只删除最后一项。应该可以这样做:

for(int i = tail.length - 2; i >= 0; i--){
    tail[i + 1] = tail[i];
}
tail[0] = new Tail(ball.getX(),ball.getY());

这样您只需移动Tail实例,而不是创建新实例。除非我误解了某些内容,否则这应该有用。

听起来你可以从使用队列中获益。队列设计用于在一端插入元素并从另一端检索项目。

如果您使用LinkedList(它实现了Deque接口)而不是数组,那么您应该可以执行以下操作:

tail.addFirst(new Tail(ball.getX(), ball.getY()));
tail.removeLast();

答案 3 :(得分:1)

此功能类似于 FIFO 。因此,您可以使用Queue来实现此功能。

enter image description here

Object firstElement = queue.remove();

要从队列中删除元素,请调用 remove()方法。此方法删除队列头部的元素。在大多数Queue实现中,队列的头部和尾部位于相反的两端

Queue queueA = new LinkedList();

queueA.add("element 0");
queueA.add("element 1");
queueA.add("element 2");

add()方法将元素添加到尾部

现在,如果你调用queueA.remove();

它将插入第一个元素

element 0

现在使用它并实现自己的逻辑。

答案 4 :(得分:0)

您不应该使用数组。使用像Stack这样的东西,如下所示:

Stack stack = new Stack();

//you add elements to stack using push method
stack.push("Test");
stack.push("Test2");