对包含匹配的“值”对的NSMutableArray进行排序

时间:2010-10-04 00:21:51

标签: iphone objective-c sorting methods nsmutablearray

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

我如何按用户名排序?

我如何按日期排序?

我应该使用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"?
}

3 个答案:

答案 0 :(得分:1)

为什么你不使用NSDictionary?您可以将用户名作为键,将日期作为相应的值。然后,如果要对用户名进行排序,只需使用[dictObj allkeys]获取仅包含键的数组。根据需要对它们进行排序,然后在显示时显示已排序的键数组,并获取键的相应值并沿侧面显示。同样,您可以使用[dictObj allValues]对所有值进行排序,并将其与键一起显示。

答案 1 :(得分:0)

  

我不想改变anArray的设计方式,因为它也在其他地方用作UITableView的数据源

这是否意味着单元格在显示用户名和日期之间交替,或者您是否乘以/除以2?

无论哪种方式,您都需要修复模型。你去“oops,排序不起作用”的位应该是一个很大的提示,你没有选择好的数据表示。添加变通方法只会导致更多的眼泪。

我建议这样的事情:

  1. 创建一个类来表示您的(用户名,日期)元组。
  2. 添加-compareByDate:和-compareByUsername:methods。
  3. [array sortUsingSelector:@selector(compareByDate :)]
  4. 如果你想在交替的细胞中显示用户名和日期,那么它仍然很容易,但我只是使用一个更高的细胞并为自己省去一些痛苦。

    注意: Objective-C方法调用的开销意味着您可以通过使用sortUsingComparator:并定义适当的函数来获得显着的性能提升(您可以将函数粘贴在@implmentation和@end之间让他们访问受保护/私有的ivars)但除非你确定排序是瓶颈,否则不值得这样做。

答案 2 :(得分: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];
    }];

}