使用可比较的比较不同的变量

时间:2015-06-14 00:17:12

标签: java libgdx comparison comparator comparable

我熟悉使用Comparable界面的标准比较,虽然今天我想要比较几个不同的变量时遇到麻烦。

我基本上想要实现一个compareTo方法,只有当以下if语句为真时才产生结果 -1

if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ)

虽然,我不确定这是否可以使用类比,或者我不熟悉它。因为当我尝试这种方法时

public int compareTo(IsoSprite o) {
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ){
        return -1;
    }else if(o.maxX < minX && o.maxY < minY && o.minZ > maxZ){
        return 1;
    }
    return 0;
}

我收到错误&#34;比较方法违反了其总合同!&#34; 。我想澄清一点,我不需要帮助来理解这个错误的含义,因为我已经阅读了几个有关它的问题。虽然,我仍然无法解决这个特殊问题,因为我读过的其他问题的解决方案都是微不足道的。

我非常感谢这种比较的一些帮助,它将是一个救生员。任何意见也很受欢迎。

编辑:经过测试后,我得到的东西几乎可以使用(并非在所有情况下),但我无法找出原因:

public int compareTo(IsoSprite o) {
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) {
        return -1;
    } else if (o.maxX > minX && o.maxY > minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) {
        return 1;
    }else if (o.maxX > minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) {
        return 1;
    }else if(this != o){
        return 1;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

如果您使用它来对对象进行排序,那么您的Comparable或Comparator必须表现良好,并且必须遵守传递和其他规则。如果没有,那么您的代码就会被破坏。建议您的比较方法与equals一致,这意味着a.compareTo(b)当且仅当a.equals(b)返回0时,但与删除的答案中所述的不同,这不是绝对要求

你的代码仍然会破坏比较的可交换规则,即

让我们看看你的规则:

func save() {
        var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
        var moc: NSManagedObjectContext = appDel.managedObjectContext!
        var whoTook: AnyObject! = NSEntityDescription.insertNewObjectForEntityForName("PhotoListEntity", inManagedObjectContext: moc)
        var error: NSError?
        moc.save(nil)
    }

看看&#34;比较C&#34;:

a.compareTo(b) == -b.compareTo(a)

返回1.相反的情况应该返回-1,但它没有,因为我们在&#34;比较H&#34;中找到了相反的结果:

public int compareTo(IsoSprite o) {
    // Comparison A
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) {
        return -1;
    // Comparison B
    } else if (o.maxX > minX && o.maxY > minY && o.minZ > maxZ) {
        return 1;
    // Comparison C
    }else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) {
        return 1;
    // Comparison D
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    // Comparison E
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) {
        return 1;
    // Comparison F
    }else if (o.maxX > minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    // Comparison G
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    // Comparison H
    }else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) {
        return 1;
    // Comparison I
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) {
        return 1;
    // Comparison J
    }else if(this != o){
        return 1;
    }
    return 0;
}

但它也会返回1.因此,这里(可能在其他地方)a.compareTo(b)不等于b.compareTo(a)的 - 。