2010-10-05 63 views
1

我做了一個叫Person的班。它看起來像這樣如何排序這個NSMutableArray?

Person 
------- 
Name 
Points 

然後我創建了一個名爲team的NSMutableArray。它包含這些人物中的幾個。我創建了幾個團隊。

然後我創建了另一個名爲allTeams的NSMutableArray。它擁有所有團隊陣列。

我想按照每個團隊的總點數排序allTeams陣列,通過總結團隊中每個人的點數來找到。

我該怎麼做?

回答

1

無需渣土周圍多餘的ivars,除非你有百萬玩家與成千上萬的隊伍,天真的實施將是速度比你可能需要的。

@interface Team : NSObject { 
    NSMutableArray *people; 
} 

@property (readonly) NSInteger score; 

@end 

@implimentation Team 

- (NSInteger)score { 

    NSInteger score = 0; 

    for(Person *person in people) { 
     score = score + person.points; 
    } 

    return score; 
} 

@end 

// To sort an array of teams, do the following 
// assumes that `teams` is a mutable array containing all teams 

NSSortDescriptor *scoreSort = [[NSSortDescriptor alloc] initWithKey:@"score" ascending:NO]; 
[teams sortUsingDescriptors:[NSArray arrayWithObject:scoreSort]]; 
[scoreSort release]; 

聲明:我寫了上面的代碼,但沒有訪問我的Mac,所以它可能無法按照書面編譯,但它很接近。祝你好運!

+0

不應該是NSMutableArray而不是NSObject? – 2010-10-05 21:10:34

+0

@awakeFromNib:從概念上講,一個團隊不僅僅是一個玩家的集合,它具有適用於它的屬性,比如它的名字等等。創建一個Team類好得多,它擁有一個ivars集合球員(正如庫比所做的那樣)。 – JeremyP 2010-10-06 14:48:47

1

爲什麼不在團隊對象中維護一個int變量,這是團隊中每個人的累積分數?當你想進行比較時,只需根據該字段進行排序。任何排序算法都可以工作,有明顯的內存需求警告(就地與額外分配的內存)以及最壞情況運行時間(O(n^2),O(nlog(n))。

在第一次請求排序信息時,所有團隊的得分都是O(n^2),然後每次有人得分時,只需調用一個選擇器來更新該人的得分,然後更新團隊得分

+0

Team對象將是一個NSMutableArray,是否正確?那麼我將不得不繼承NSMutableArray來創建這個int變量? – 2010-10-05 21:11:45

+0

根據您如何描述問題,Person對象將擁有一個int ivar,該int ivar爲該特定人員提供評分。根據您的需要,您的Team對象可以像NSMutableArray一樣簡單,也可以像其他對象一樣複雜,具體取決於您的需要。正如你所說,無論哪種情況,它都是一個NSMutableArray。唯一的區別是它是「獨立」還是人員數組在Team對象中。類似的邏輯將適用於團隊NSMutableArray。 – davidstites 2010-10-06 13:39:54