2012-05-22 3 views
2

У меня есть NSMutableArray с объектами Link, который имеет параметр Byte taskOne. Мне приходится сортировать объекты по этому параметру.Как сортировать NSMutableArray по параметру объекта

for (Byte i = 0; i < [linksArray count]-1; i++) { 
     Link *l = [linksArray objectAtIndex:i]; 
     Link *lNext = [linksArray objectAtIndex:i+1]; 
     if (l.taskOne >= lNext.taskOne) { 
      NSLog(@"%d >= %d", l.taskOne, lNext.taskOne); 
      [linksArray replaceObjectAtIndex:i withObject:lNext]; 
      [linksArray replaceObjectAtIndex:i+1 withObject:l]; 
     } 
    } 

Это дает мне неправильные результаты, но я не знаю, что случилось. Благодарю вас за помощь.

+0

см [это] (http://stackoverflow.com/questions/1348748/how-to-sort-an-nsmutablearray-of-managed-objects-through-an-object- график). –

ответ

5

Самый простой способ сортировки массива заключается в использовании NSSortDescriptor с КВЦ, как это:

NSArray *linksArray; // Assume that this contains objects which respond to the -taskOne method 

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"taskOne" ascending:YES]; 
NSArray *sortedLinks = [linksArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

Это создаст новый массив. Для сортировки на месте в NSMutableArray, сделайте следующее:

NSMutableArray *linksArray; // Assume that this contains objects which respond to the -taskOne method 

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"taskOne" ascending:YES]; 
[linksArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
+0

не работает:/http://pastebin.com/RzM2pKJf –

+1

'sortedArrayUsingDescriptors:' возвращает новый массив; он не сортируется на месте. Если вы хотите сортировать на месте, используйте 'sortUsingDescriptors:'. – Wevah

+1

@TomaszSzulc Извините, я пропустил немного о том, что это изменяемый массив. Я добавил второй пример, который показывает, как использовать 'NSSortDescriptor', чтобы сделать вид на месте. –

1

это выглядит как своего рода BubbleSort, но вам нужно две петли. в настоящее время вы запускаете один раз через свой массив, а самый высокий объект должен быть по последнему индексу. Теперь вам нужно пробежать массив до длины-1. попробовать что-то вроде этого:

for (Byte j = 1; j < [linksArray count]; j++) { 
    for (Byte i = 0; i < [linksArray count]-j; i++) { 
     //your code from above 
    } 
} 
+0

Спасибо за помощь. работает ;) –

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