2014-09-15 3 views
1

Я хочу вставить объект NSDictionary в массив и отсортировать массив по объектуForKey.Вставка NSDictionary в отсортированный NSMutableArray

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

Текущий код:

-(NSMutableArray*)sortArray:(NSMutableArray*)theArray { 
    return [[theArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"n" 
                              ascending:YES]]] mutableCopy]; 
} 

возвращает повторно сортируется массив. Хорошо. Работает отлично, но ... это наиболее эффективно?

С другой вопрос, я заключаю, что это метод, используемый для поиска индекса для вставки в:

NSUInteger newIndex = [array indexOfObject:newObject 
         inSortedRange:(NSRange){0, [array count]} 
           options:NSBinarySearchingInsertionIndex 
         usingComparator:comparator]; 

[array insertObject:newObject atIndex:newIndex]; 

Проблема заключается в том, я понятия не имею, как использовать метод компаратор, и если это вообще возможно когда я хочу сортировать objectForKey для каждого индекса.

Можно ли иллюстрировать вышеупомянутый метод, когда ключ объекта (newObject в приведенном выше примере) для сортировки, давайте скажем:

[newObject objectForKey:@"sortByThis"]; 

ответ

0

вот простой пример для сравнения

- (NSComparisonResult)compareResulst:(CustomObject *)otherObject { 
    if(self.name isEqualToString:key) 
    { 
     return NSOrderedAscending; 
    } 
    else 
    { 
     return NSOrderedDescending 
    } 
} 

NSArray *sArray; 
sArray = [unsArray sortedArrayUsingSelector:@selector(compareResulst:)]; 

это сортирует массив. он будет перебирать объекта и на основании вашего, если же она будет двигаться объект вверх и вниз ...

+0

Не могли бы вы рассказать об этом? Возможно, с полным примером. Я не понимаю, как любой из вышеперечисленных мог бы получить правильный индекс для ввода объекта? – nickdnk

+0

используйте ключ словаря и сравнивайте себя и другие объекты. и вернуть NSComparisonResult ... позвольте мне попытаться изменить пример –

+0

Разве это не возвращает мой отсортированный массив - как то, что я уже делаю? Я пытаюсь извлечь, в какую indexPath включить, чтобы предотвратить повторную сортировку всего массива. – nickdnk

0

Используйте NSSortDescriptor

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sortByThisKey" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors]; 
+0

Это перебирает весь массив, он не дает возможности вставлять нужный индекс, чего я пытаюсь выполнить. – nickdnk

0

Вот пример сортировки

//For make a we're adding 5 random integers into array inform of NSDictionary 
//here, we're taking "someKey" to store the integer (converted to string object) into dictionary 
NSMutableArray *array = [NSMutableArray array]; 
for(int i = 1; i<=5; i++) { 
    [array addObject:[NSDictionary dictionaryWithObject:[@(arc4random()%10) stringValue] forKey:@"someKey"]]; 
} 

//create a sort descriptor to sort the array 
//give the key in dictionary for which you want to perform sort 
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"someKey" ascending:YES]; 
//we're doing self sort for mutable array, & that's it, you'll have a sorted array. 
[array sortUsingDescriptors:@[sort]]; 

нотабене

1. Вместо «someKey» из приведенного выше примера вы можете установить любую клавишу, для которой вы хотите выполнить сортировку.

2.Есть некоторые другие методы сортировки, вы можете использовать одну базу по своему требованию.

3.see @[sort] в коде. Его полная версия: [NSArray arrayWithObject:sort];

+0

Это то, что я уже делаю. Я обновил свой вопрос с помощью текущего кода. Я искал способ избежать использования SortDescriptor и вместо этого выбирал indexPath, который соответствовал сортировке массива. – nickdnk

+1

Хорошо, вы можете проверить, возможно ли время выполнения функции, [проверить это] (http://stackoverflow.com/questions/2129794/how-to-log-a-methods-execution-time-exactly-in-milliseconds) , – Hemang

+0

Спасибо, я посмотрю на это. – nickdnk