使用循环比较对数组进行排序(无限循环?)

时间:2010-02-24 17:00:03

标签: iphone sorting arrays compare

我有一些对象有3个排序选项:质量,质量和与其他对象的比较,按该顺序排序。

- (NSComparisonResult) compare: (MyObject *) obj {
if (self.quality > obj.quality)
return NSOrderedAscending;
else if (self.quality < obj.quality)
return NSOrderedDescending;

if (self.quantity > obj.quantity)
return NSOrderedAscending;
else if (self.quantity < obj.quantity)
return NSOrderedDescending;

if ([self betterThan: obj])
return NSOrderedAscending;

if ([obj betterThan: self])
return NSOrderedDescending;

return NSOrderedSame;
}

我的问题是,如果对象具有相同的质量和数量,betterThan:方法可能会导致循环比较,并且我想在这种情况下返回任何排序顺序。

例如,A,B和C具有相同的质量/数量,但

A betterThan: B => YES
B betterThan: C => YES
C betterThan: A => YES

解决方案?感谢。

3 个答案:

答案 0 :(得分:0)

您应该让betterThan:方法返回NSOrderedSame。返回NSComparisonResult的所有方法应始终能够返回所有三个选项。

您的方法永远不会超过第一个if -block:

if (self.quality > obj.quality)
    return NSOrderedAscending;
else
    return NSOrderedDescending; //<== returns for both self.quality > obj.quality AND self.quality == obj.quality

由于比较必须具有三个结果中的一个,但您只测试一个结果,因此您将始终从该if-block中的方法返回。其他任何逻辑都不会被使用。

您需要嵌套if-blocks以获取过滤逻辑。测试它们是否更大和更小并且返回但是如果它们是相同的移动到下一个测试。根据需要重复。

- (NSComparisonResult) compare: (MyObject *) obj {
    if (self.quality > obj.quality)
        return NSOrderedAscending;
    else if (self.quality < obj.quality)
        return NSOrderedDescending; 
    else {
        if (self.quantity > obj.quantity)
            return NSOrderedAscending;
        else if (self.quantity < obj.quantity)
            return NSOrderedDescending;
        else {
            ... and so on
        }
    }

我认为每个属性比较都应该有自己的方法。然后,如果需要全面比较类中的两个对象,则可以将它们组合成一个大比较。

在这种情况下,betterThan:方法就是您的实际类比较。

答案 1 :(得分:0)

我对你的代码以及你的问题有点困惑。你看到的比较函数看起来只会比较质量(第一个的两个分支,如果有回报)。如果你只想在比较中使用更好(我认为你面临的问题是什么......)我会做类似的事情:

- (NSComparisonResult) compare: (MyObject *) obj {
    if ([self betterThan: obj])
        if ([obj betterThan: self])
            return NSOrderedSame
        else
            return NSOrderedAscending;
    else
        return NSOrderedDescending
}

答案 2 :(得分:0)

好的,我发现这个bug与排序无关(虽然它似乎是由它引起的)。

显然这确实有效。如果出现死锁,系统会停止排序。

谢谢你的时间,无论如何。 :)