我收到此错误:
Exception in thread "Thread-3" java.lang.IllegalArgumentException: Comparison method violates its general contract!
当我尝试在Java中为我的实体系统运行这个比较器时:
private Comparator<Entity> spriteSorter = new Comparator<Entity>() {
public int compare(Entity e0, Entity e1) {
if (e1.position.getX() <= e0.position.getX())
return +1;
if (e1.position.getY() >= e0.position.getY())
return -1;
return 0;
}
};
以下是实施:
private void sortAndRender(Bitmap b, Vec2 offset, ArrayList<Entity> l) {
Collections.sort(l, spriteSorter);
for (int i = 0; i < l.size(); i++) {
l.get(i).render(b, offset);
}
}
当我在屏幕上显示大量实体时,才真正开始出现此问题。这里发生了什么?
答案 0 :(得分:1)
你的比较器完全错了。更好的是像
if (e1.position.getX() != e0.position.getX())
return Integer.compare(e1.position.getX(), e0.position.getX());
if (e1.position.getY() != e0.position.getY())
return Integer.compare(e1.position.getY(), e0.position.getY());
return 0;
答案 1 :(得分:0)
虽然@Louis在很大程度上打败了我,但是要详细说明并澄清......
您的比较方法必须相当“稳定”并且完整。对于许多X和Y不同的情况,你的将返回0,“等于”。
我将其重写为
int result = Integer.compare(e1.position.getX(), e0.position.getX());
if (result == 0)
result = Integer.compare(e1.position.getY(), e0.position.getY());
... if you have more to compare, add more if (result == 0) blah blah here...
return result;
至于“稳定”,假设你有两点,a = 4,2和b = 2,4
将a与b进行比较时,得到0 但是当你将b与a进行比较时,你会得到1。
这在比较器中是“非法的”。 a.compareTo(b)应该等于-b.compareTo(a)
答案 2 :(得分:0)
哈哈,问题是我出于某种原因将它们基于x位置移动到列表中,并根据y位置向下移动?!?!?这是我的一个非常愚蠢的错误