2010-10-04 85 views
0

我不想改变anArray的设计方式,因为它在其他地方也用作UITableView的数据源。奇数值是“用户名”,偶数值是它们匹配的“日期”。 (“对”必须保持在一起。)排序包含匹配“对”值的NSMutableArray

我将如何对“按用户名”进行排序?

如何排列“按日期”?

我应该使用sortUsingFunction还是sortUsingSelector?

-(void) test 
{ 
    NSMutableArray *anArray = [NSMutableArray arrayWithObjects:@"Zeke", @"01-Jan-2010", @"Bob", @"02-Jan-2010", @"Fred", @"03-Jan-2010", @"Susan", @"04-Jan-2010", @"Kim", @"05-Jan-2010", @"Debbie", @"06-Jan-2010", nil]; 
    [anArray sortUsingFunction:SortByDate context:(void *)context]; 
} 

NSComparisonResult SortByDate(NSMutableArray *a1, NSMutableArray *a2, void *context) 
{ 
    // What goes here to keep the pair-values "together"? 
} 

回答

1

为什么你不使用NSDictionary?您可以将用户名称作为关键字,并将日期作为相应的值。然后,如果你想对用户名进行排序,只需使用[dictObj allkeys]来获得一个只包含键的数组。按照您的喜好对它们进行排序,然后在显示时显示排序后的按键数组并获取按键的对应值并沿边显示。同样,您可以使用[dictObj allValues]对所有值进行排序并将它们与键一起显示。

+0

唉。这涉及使用 - [NSDictionary allKeysForObject:]不能很快。 – 2010-10-04 03:27:08

+0

当排序键(例如上面的日期)不能保证每个对象都是唯一的时,这种方法将不起作用。 – damian 2013-06-10 12:31:57

0

我不希望改变anArray的设计,因为它是在其他地方也作为一个UITableView

这是否意味着显示用户名和日期之间交替单元,或者你是一个数据源的方式乘以/除以2?

无论采用哪种方式,都需要修复模型。 “哎呀,排序不起作用”的位置应该是一个很大的暗示,即你没有选择一个好的数据表示。添加一个解决方法只会导致更多的眼泪。

我建议是这样的:

  1. 创建一个类来表示你的(用户名,日期)的元组。
  2. 添加-compareByDate:和-compareByUsername:方法。
  3. [阵列sortUsingSelector:@selector(compareByDate :)]

如果你想在交替的单元格来显示用户名和日期,那么它仍然是很容易做到的,但我会简单地用一个更高的细胞和保存我自己有些痛苦。

注: Objective-C的方法调用的开销意味着你可以通过使用一个sortUsingComparator性能显著增加:并定义相应的功能(你能坚持@implmentation和@end之间的功能,让他们访问受保护/ private ivars),但除非你确定排序是一个瓶颈,否则它并不值得这样做。

+0

不幸的是,我们不可能为几年前我们继承的这个混乱添加更多的类,更多的代码和更复杂的东西。我不能再进行另一次谈话,我试图说服其他城市的部门重新设计他们的代码......只是这样我们才能“以正确”的方式“排序7个项目并节省0.001秒的时间”。是否真的没有办法“在现有NSArray设计中成对分类”? (如果我告诉他们“这是完全不可能的”......我相信这也会造成重大问题。) – Patricia 2010-10-04 16:00:52

+0

哦,*那*代码。我很抱歉☹我只是将它们包装在课堂上,对它们进行整理,然后再打开它们。 – 2010-10-13 20:50:03

+0

但*如何*我会将它们包装在课程中,对它们进行分类,然后再打开它们? – Patricia 2010-10-15 01:52:50

0

像这样的东西可以工作:

@class SortWrapper: NSObject 
@property (copy,readwrite,atomic) NSString* name; 
@property (copy,readwrite,atomic) NSDate* date; 
@end 

... 

- (void)test 
{ 
    NSArray* names = @[@"Alice", @"Bob", @"Cameron"]; 
    NSArray* dates = @[aliceDOB, bobDOB, cameronDOB]; // NSDate objects 

    // turn into wrapped objects for sorting  
    NSMutableArray* wrappedObjects = [NSMutableArray array]; 
    for (int i=0; i<names.count; i++) { 
     SortWrapper* wrapped = [[SortWrapper alloc] init]; 
     wrapped.name = names[i]; 
     wrapped.date = dates[i]; 
     [wrappedObjects addObject:wrapped]; 
    } 

    // to sort by date: 
    NSArray* sortedByDate = [wrappedObjects sortedArrayUsingComparator:^NSComparisonResult(SortWrapper* obj1, SortWrapper* obj2) { 
     return [obj1.date compare:obj2.date]; 
    }]; 

    // to sort by name: 
    NSArray* sortedByName = [wrappedObjects sortedArrayUsingComparator:^NSComparisonResult(SortWrapper* obj1, SortWrapper* obj2) { 
     return [obj1.name compare:obj2.name]; 
    }]; 

}