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

Java array add new value to the first and remove the last

我正在尝试更新我的数组,所以如果您向第一个数组 tail[0] 添加一些内容,整个数组都会更新并将 1 移动到下一个,最后最后一个 tail[49] 将被删除。

因此,如果我向 tail[0] 添加一个值,我希望 tail[1] 获得旧的 tail[0] 值,tail[2] 获得旧的 tail[1] 值,而 tail[3]获取旧的 tail[2] 值。旧 tail[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);
    }
}

尾部class:

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);
    }

}

尾部空洞最终导致我的游戏崩溃,解决这个问题的最佳方法是什么?

不要为这样的事情使用数组 - 请改用 Stack。

你不应该为它使用数组。使用类似于 Stack 的东西,它可以像下面这样工作:

Stack stack = new Stack();

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

尝试以下代码(已更新)

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;
}

首先,当您尝试移动尾巴时,您似乎正在创建一个新的 Tail。有什么理由吗?您应该能够 re-use 相同的实例,只需移动引用即可。

此外,在您的代码中,您试图在位置 0 插入新元素, 移动所有其他元素之前。您需要以相反的方式进行操作,以确保只删除最后一项。应该可以用这样的东西:

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

这样您只是移动 Tail 个实例,而不是创建新实例。除非我误解了什么,否则这应该有效。

听起来您确实可以从使用 Queue 中获益。 Queue 旨在在一端插入元素并从另一端检索项目。

如果您使用 LinkedList(它实现了 Deque 接口)而不是数组,您应该可以这样做:

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

此功能类似于 FIFO。所以可以使用Queue来实现这个功能。

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

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