Я думаю, что ваша проблема не имеет ничего общего с вашим выбором структуры данных, но вместо этого, потому что вы изменяете List
, пока вы зацикливаетесь на этом .
Представьте, что в вашем списке три плоскости - [P1, P2, P3].
- На первой итерации вашего цикла
i
равно 0
, вы обрабатываете P1
- P1 имеет
getX() < -50
, поэтому вы удалите его, составив список сейчас [P2, P3]
- На следующей итерации цикла
i
теперь 1
, поэтому вы обрабатываете P3.
- Это означает, что P2 никогда не обрабатывается и поэтому никогда не будет отрисован, поэтому он ненадолго исчезнет.
Попробуйте использовать Iterator
, который позволит вам безопасно удалять элементы, зацикливаясь на List
.
Iterator<Plane> i = planes.iterator();
while (i.hasNext()) {
Plane p = i.next();
if (p.getX() < -50) {
i.remove();
} else {
p.onDraw(c);
if (p.getX() < 170) {
detectPlaneCollision(p, c);
}
}
}
Хотя, поскольку вас не волнует порядок, в котором вы обрабатываете свои Plane
объекты, вы можете хранить их в Set
, а не List
. Set
не нужно беспокоиться о сохранении порядка элементов при их добавлении и удалении.