2011-04-28 72 views
4

对不起,问愚蠢的问题..将数组排序在订单..?

我有喜欢类对象的数组:

Class User { 
    NSString *firstName, *LastName; 
} 
@property (nonatomic, retail) NSString *firstName; 
@property (nonatomic, retail) NSString *LastName; 

我创建这个类的对象,并在加的NSMutableArray它。

现在我想排序这个数组的名字..任何想法请。

我可以使用NSSortDescriptor对数组进行排序,或者我必须使用自定义逻辑。

我早些时候曾做过这样的事情,但现在我忘了这一点,并没有对现在正确的源代码

请帮助我..谢谢

EDIT:我有几样回复我试过但没有工作。我正在解析JSON,因此myArray中会有未知数量的对象。所以我用:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]; 
[myArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

NSMutableArray *tempArray = [myArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

但是毫无效果..

Edit 2

下面是说明: 阵列

"<User: 0xa3f13c0>", 
    "<User: 0xa3f1410>", 
    "<User: 0xa3f1450>", 
    "<User: 0xa3f1490>" 

有序数组

"<User: 0xa3f13c0>", 
"<User: 0xa3f1410>", 
"<User: 0xa3f1490>", 
"<User: 0xa3f1450>" 

在for循环: 阵列

John 
abc 
test 
qwertg 

有序数组

John 
abc 
test 
qwertg 
+0

你可以发布两个数组的前后排序的NSLog输出吗?在这样做之前,我会在用户类中添加一个描述覆盖,应该看起来像 - (NSString *)description {return [NSString stringWithFormat:@“Firstname - %@”,self.firstName];} – 2011-04-28 10:40:07

+0

再次更新我的帖子 – 2011-04-28 10:54:54

回答

9

如果你的目标的iOS4 +那么你可以使用sortUsingComparator:方法:

[yourArray sortUsingComparator:^(id obj1, id obj2){ 

     User* u1 = (User*)obj1; 
     User* u2 = (User*)obj2; 
     return [u1.firstName compare:u2.firstName]; 
    }]; 

编辑:作为比较方法考虑字符情况下,你可能需要使用caseInsensitiveCompare:方法来代替它:

[yourArray sortUsingComparator:^(id obj1, id obj2){ 

     User* u1 = (User*)obj1; 
     User* u2 = (User*)obj2; 
     return [u1.firstName caseInsensitiveCompare:u2.firstName]; 
    }]; 
+0

谢谢@Vladimir caseInsensitiveCompare工作就像一个魅力..非常感谢。 – 2011-04-28 13:00:51

+1

你可以缩短:'^(User * u1,User * u2){return [u1.firstName caseInsensitiveCompare:u2.firstName]; }' – SSteve 2012-07-03 22:35:50

4

这可能是你要寻找的最彻底的方法:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]; 
[myArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

一种有趣的方式是使用代码块,如果你不需要预先iOS4的数组进行排序后向兼容性,虽然

[myMutableArray sortUsingComparator: 
^(id a, id b) 
{ 
    User *userA = (User *)a; 
    User *userB = (User *)b; 
    return [userA.firstName compare:userB.firstName]; 
}]; 

这将允许您在那里添加一些额外的逻辑,以防将来使用额外的或其他分类条件。

+0

如果你想要不使用块的附加逻辑,你可以使用sortUsingSelector :. – vakio 2011-04-28 09:14:15

+0

我很喜欢使用你给出的第一种方式,但它不排序我的数据。 – 2011-04-28 10:23:12

+0

第二种方法也不排序我的数组..不给任何影响.. – 2011-04-28 10:30:10