Сортировка изменяемого массива с использованием словарного ключа - PullRequest
0 голосов
/ 29 января 2011

Я пытаюсь создать простой изменяемый массив с одним ключом («dayCounter»), который я намерен использовать для сортировки.Я прочитал множество примеров в сети, но без радости.

Итак, я создаю этот массив.Обратите внимание, что первая запись является объектом NSDictionary.(Другие объекты являются текстовыми)

cumArray = [NSMutableArray arrayWithObjects:[NSMutableArray arrayWithObjects:
                                                         [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"%i", dayCounter] forKey:@"dayCounter"],[[dailyArray objectAtIndex:x]objectAtIndex:0],[[dailyArray objectAtIndex:x]objectAtIndex:1],[[dailyArray objectAtIndex:x]objectAtIndex:2], nil],nil];

Я сохраняю массив в plist, и все выглядит отлично после загрузки.

Однако, когда я прихожу, чтобы отсортировать массив, программа падает,Я пробовал каждую комбинацию из следующего:

        NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dayCounter" ascending:YES];
        [cumArray sortUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]];

Нужен ли элемент словаря, чтобы действовать в качестве ключа?Можно ли проще отсортировать по первому объекту?Любая помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 29 января 2011

Иногда использование слишком большого количества вложенных выражений может скрыть то, что происходит на самом деле.Например, «простой» изменяемый массив, который вы создали, на самом деле содержит вложенный изменяемый массив, а не содержит словари, которые вы пытаетесь отсортировать.

Вместо этого:

cumArray = [NSMutableArray arrayWithObjects:[NSMutableArray arrayWithObjects:
                                                     [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"%i", dayCounter] forKey:@"dayCounter"],[[dailyArray objectAtIndex:x]objectAtIndex:0],[[dailyArray objectAtIndex:x]objectAtIndex:1],[[dailyArray objectAtIndex:x]objectAtIndex:2], nil],nil];

попробуйте сделать это

NSDictionary *dict1 = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"%i", dayCounter]
                                                  forKey:@"dayCounter"]
NSArray *objs = [dailyArray objectAtIndex:x];
NSDictionary *dict2 = [objs objectAtIndex:0];
NSDictionary *dict3 = [objs objectAtIndex:1];
NSDictionary *dict4 = [objs objectAtIndex:2];

// Note: You might want to temporarily log the values of dict2 - 4 here to make sure they're
// really dictionaries, and that they all actually contain the key 'dayCounter'.

cumArray = [NSMutableArray arrayWithObjects:dict1, dict2, dict3, dict4, nil];

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

0 голосов
/ 29 января 2011

Вам необходимо отсортировать массив с помощью метода, например - (NSComparisunResult) compareDict Если вам нужно сравнить 2 словаря и определить, какой из них должен быть упорядочен над другим (NSOrderedAscending), вам необходимо «расширить» NSDictionary:

@interface NSDictionary (SortingAdditions) {}
- (NSComparisonResult)compareTo:(NSDictionary *)other;
@end
@implementation NSDictionary (SortingAddictions)
- (NSComparisonResult)compareTo:(NSDictionary *)other
{
  if( [self count] > [other count] )
  { return NSOrderedAscending; }
}
@end

Этот метод сортирует NSDictionaries по количеству объектов, которые они содержат.Другие значения, которые вы можете вернуть здесь: NSOrderedDescending и NSOrderedSame.

Затем вы можете отсортировать изменяемый массив следующим образом:

[SomeMutableArray sortUsingSelector:@selector(compareTo:)];

Имейте в виду, что каждый объект в массиве должен бытьNSDictionary, в противном случае вы получите исключение: нераспознанный селектор, отправленный экземпляру blabla

Вы можете сделать то же самое для любого типа объекта, если массив содержит и NSStrings, NSNumbers и NSDictionaries, вы должны использовать другой подход

0 голосов
/ 29 января 2011

Ваша настройка не имеет смысла.Вы сами говорите, что только первый объект в массиве - это словарь, содержащий ключ `@" dayCounter "(" Другие объекты - текст ").Как это должно быть отсортировано, если только один объект содержит критерии сортировки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...