我做了一個叫Person的班。它看起來像這樣如何排序這個NSMutableArray?
Person
-------
Name
Points
然後我創建了一個名爲team的NSMutableArray。它包含這些人物中的幾個。我創建了幾個團隊。
然後我創建了另一個名爲allTeams的NSMutableArray。它擁有所有團隊陣列。
我想按照每個團隊的總點數排序allTeams陣列,通過總結團隊中每個人的點數來找到。
我該怎麼做?
我做了一個叫Person的班。它看起來像這樣如何排序這個NSMutableArray?
Person
-------
Name
Points
然後我創建了一個名爲team的NSMutableArray。它包含這些人物中的幾個。我創建了幾個團隊。
然後我創建了另一個名爲allTeams的NSMutableArray。它擁有所有團隊陣列。
我想按照每個團隊的總點數排序allTeams陣列,通過總結團隊中每個人的點數來找到。
我該怎麼做?
無需渣土周圍多餘的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,所以它可能無法按照書面編譯,但它很接近。祝你好運!
爲什麼不在團隊對象中維護一個int變量,這是團隊中每個人的累積分數?當你想進行比較時,只需根據該字段進行排序。任何排序算法都可以工作,有明顯的內存需求警告(就地與額外分配的內存)以及最壞情況運行時間(O(n^2),O(nlog(n))。
在第一次請求排序信息時,所有團隊的得分都是O(n^2),然後每次有人得分時,只需調用一個選擇器來更新該人的得分,然後更新團隊得分
Team對象將是一個NSMutableArray,是否正確?那麼我將不得不繼承NSMutableArray來創建這個int變量? – 2010-10-05 21:11:45
根據您如何描述問題,Person對象將擁有一個int ivar,該int ivar爲該特定人員提供評分。根據您的需要,您的Team對象可以像NSMutableArray一樣簡單,也可以像其他對象一樣複雜,具體取決於您的需要。正如你所說,無論哪種情況,它都是一個NSMutableArray。唯一的區別是它是「獨立」還是人員數組在Team對象中。類似的邏輯將適用於團隊NSMutableArray。 – davidstites 2010-10-06 13:39:54
不應該是NSMutableArray而不是NSObject? – 2010-10-05 21:10:34
@awakeFromNib:從概念上講,一個團隊不僅僅是一個玩家的集合,它具有適用於它的屬性,比如它的名字等等。創建一個Team類好得多,它擁有一個ivars集合球員(正如庫比所做的那樣)。 – JeremyP 2010-10-06 14:48:47