2010-02-24 61 views
0

我有一些有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 

解?謝謝。

回答

0

好吧,我發現這個bug已經無關排序(儘管它似乎是由它造成的)。

顯然這實際上有效。如果發生死鎖,系統將停止排序。

感謝您的時間,無論如何。 :)

0

您應該有betterThan:方法返回NSOrderedSame。返回NSComparisonResult的所有方法應始終能夠返回全部三個選項。

你的方法絕不會通過過去的第一個如果 - 阻塞:

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

由於比較必須有一個三種結果之一,但你唯一的測試,你會從方法在如果 - 總是返回塊。沒有其他的邏輯會被使用。

您需要嵌套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:方法是您實際的班級比較。

+0

是的,你是對的,我寫這個代碼匆忙。我修正了:) 但是,刪除所有其他比較和堅持以betterThan:作爲我唯一的比較,我一直得到的是墜毀,因爲它不會停止排序,我相信。我沒有從調試器得到任何輸出,所以我不能真正說。 – 2010-02-25 04:04:36

0

我對你的代碼和你的問題有點困惑。比較函數看起來像只會比較質量(第一個分支,如果有返回)。如果你想在只使用betterThan的比較(我認爲這是什麼問題你面對的是..)我會做這樣的事情:

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

我已經採取了預防措施,以便兩個對象永遠不會比另一個更好,這樣情況就不會真的發生。但是,對於可能發生的3個對象。排序功能將一次獲得2個對象,並使用比較功能進行比較。對於上面描述的3個對象(A,B,C),我的應用程序只是崩潰而沒有調試器輸出。 – 2010-02-25 04:08:51