我熟悉使用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;
}
答案 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)的 - 。