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
现在使用它并实现您自己的逻辑。
我正在尝试更新我的数组,所以如果您向第一个数组 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
现在使用它并实现您自己的逻辑。