2010-10-04 3 views
0

Я бы предпочел не изменять способ создания aArray, поскольку он также используется в другом месте как источник данных для 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:], который не может быть очень быстрым. –

+0

Этот подход не будет работать, если ключ сортировки (например, дата выше) не гарантированно будет уникальным для каждого объекта. – damian

0

Я бы предпочел не менять путь anArray разработан, так как он также используется в другом месте в качестве источника данных для UITableView

Означает ли это клетки чередовать отображающих имена пользователей и даты, или вы умножение/деление на 2?

В любом случае, вам необходимо исправить вашу модель. Бит, куда вы идете «oops, сортировка не работает», должен быть большим намеком на то, что вы не выбрали хорошее представление своих данных. Добавление обходного пути приведет только к более поздним слезам.

Я хотел бы предложить что-то вроде этого:

  1. Создать класс для представления вашего (имя пользователя, даты) кортежа.
  2. Add -compareByDate: и -compareByUsername: методы.
  3. [sortUsingSelector массива: @selector (compareByDate :)]

Если вы хотите отобразить имена и даты в чередующейся клетку, то она по-прежнему легко сделать, но я бы просто использовать более высокую ячейку и сохранить мне немного боль.

Примечание: Накладные расходы Objective-C вызовов метода означает, что вы можете получить значительное увеличение производительности с помощью sortUsingComparator: и определения соответствующих функций (вы можете вставить функцию между @implmentation и @end, чтобы позволить им защищенный доступ/private ivars), но на самом деле это не стоит делать, если вы не определили, что сортировка является узким местом.

+0

К сожалению, невозможно добавить больше классов, больше кода и сложностей в этот беспорядок, который мы унаследовали много лет назад. У меня не может быть еще одной беседы, где я пытаюсь убедить другие отделы в других городах перепроектировать их код ... просто чтобы мы могли «отсортировать 7 элементов и сэкономить 0,001 секунды» в «правильной» манере.Неужели нет возможности «сортировать элементы в парах, в существующем дизайне NSArray»? (Если я скажу им, что «это абсолютно невозможно» ... Я уверен, что это также создаст серьезные проблемы.) – Patricia

+0

О, * этот * вид кода. Простите, я просто заверну их в классы, сортирую их и разворачиваю. –

+0

Но * КАК * я бы обернул их в классы, сортировал их и разворачивал снова? – Patricia

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]; 
    }]; 

} 
Смежные вопросы