我的问题总结:我需要一个可以快速迭代和排序的列表(通过排序方法或添加/删除对象)。
我正在编写一个游戏,其中有很多“碰撞区域”,每帧都会检查。为了优化,我有一个想法,根据它们的 X 位置对它们进行排序。问题不是所有的碰撞区域都是静态的,因为其中一些可以移动。
我已经设法处理了所有的更改,但是维护ArrayList
(或ConcurrentLinkedQueue
)排序使用Collections.sort()
太慢了。
所以我有了一个新的想法:我可以使用树,每当一个区域的 X 发生变化时,我就可以从树中删除然后重新添加它,而不是再次对所有元素进行排序。但是,我认为在 TreeList 中添加和删除运算符也很昂贵。此外,遍历 Tree 不如ConcurrentLinkedQueue
,LinkedList
或有效ArrayList
。
请告诉我是否有任何满足我需要的内置数据结构。如果没有这样的数据结构,我打算扩展ArrayList
类,重写add
方法以确保顺序(通过使用重载add(index, item)
。如果您认为这是最好的方法,请给我找到索引的最佳方法。我已经使用 BinarySearch但我认为有一个错误:
@Override
public boolean add(T e) {
// Find the position
int left = 0;
int right = this.size() - 1;
int pos = right / 2;
if (e.compareTo(this.get(0)) <= 0) {
pos = 0;
} else if (e.compareTo(this.get(this.size() - 1)) >= 0) {
pos = this.size();
} else {
// Need: e[pos - 1] <= e[pos] <= e[pos + 1]
boolean firstCondition = false;
boolean secondCondition = false;
do {
firstCondition = this.get(pos - 1).compareTo(this.get(pos)) <= 0;
secondCondition = this.get(pos).compareTo(this.get(pos + 1)) >= 0;
if (!firstCondition) {
right = pos - 1;
pos = (left + right) / 2;
} else if (!secondCondition) {
left = pos + 1;
pos = (left + right) / 2;
}
} while (!(firstCondition && secondCondition));
}
this.add(pos, e);
return true;
}