Java Comparator引发非法参数异常

Java Comparator引发非法参数异常,java,illegalargumentexception,Java,Illegalargumentexception,我得到这个错误: Exception in thread "Thread-3" java.lang.IllegalArgumentException: Comparison method violates its general contract! 当我尝试在Java中为我的实体系统运行此比较器时: private Comparator<Entity> spriteSorter = new Comparator<Entity>() { public int co

我得到这个错误:

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 Comparator spriteSorter=new Comparator(){
公共整数比较(实体e0、实体e1){
如果(e1.position.getX()=e0.position.getY())
返回-1;
返回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);
    }
}
private void sortAndRender(位图b、Vec2偏移量、ArrayList l){
集合。排序(l,spriteSorter);
对于(int i=0;i

当我在屏幕上显示大量实体时,这个问题才真正开始出现。这是怎么回事

你的比较器完全错了。最好是这样

    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;

虽然@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、 比较到(b)应该等于-b。比较到(a)

哈哈,问题是出于某种原因,我在列表中根据x位置向上移动它们,而根据y位置向下移动它们??!?!?这是我犯的一个非常愚蠢的错误

大于/小于符号不正确,您的比较函数从不返回零您没有实现等于(Object)方法。@双为什么这与
等于
无关。这里提到的合同是:请勾选正确答案,而不是写“已解决”在问题标题中,你的解决方案没有完全奏效,但我确实注意到我做错了什么,所以还是谢谢你。