IPhone-сортировочный массив

Я хочу отсортировать массив... В моем массиве элементы находятся в этом порядке dateArray {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}

Но я хочу, чтобы этот массив в обратном порядке Я использовал этот код для реверса.

dateArray=[[NSMutableArray alloc]initWithArray:[[date reverseObjectEnumerator] allObjects]];

Но он дает этот вывод

dateArray=(
9,
8,
7,
6,
5,
4,
3,
2,
19,
18,
17,
16,
15,
14,
13,
12,
11,
10,
1,
0
)

Но я хочу этот выходной dateArray (19,18,17,16,15,14,13,12,11,10........ 2,1,0) Я также использовал метод сортировки, но результат такой же. как я могу это сделать??? Пожалуйста, помогите

Редакция:

Мои элементы массива - это содержимое каталога NSDocument.

РЕШИТЬ  этот вопрос был опрокинут. Я не знаю, как точно сортировать мой массив, как я хочу, но я изменил имя своего подпути. и он дает правильный выход.

Спасибо в Advance

Ответ 1

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

20, 19,... 10, 09, 08,... 02, 01, 00

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


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

Ответ 2

Я предполагаю, что ваш массив содержал объекты, а не числа, как в вашем вопросе. Здесь приведен пример сортировки массива в порядке возрастания или убывания.

NSArray *array = [[NSArray alloc]  initWithObjects:@"5",@"1",@"0",@"3",@"2",@"4", nil];

//or

NSArray *array = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:5], [NSNumber numberWithInt:1], [NSNumber numberWithInt:0], [NSNumber numberWithInt:3], [NSNumber numberWithInt:2], [NSNumber numberWithInt:4], nil];


NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:nil ascending:NO]; //YES, for ascending
NSLog(@"Sorted array %@",[array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sort, nil]]);

Ответ 3

вам нужно использовать

-[NSArray sortedArrayUsingSelector:]

или

-[NSMutableArray sortUsingSelector:] и передайте @selector (сравните:) как параметр.

Ответ 4

Три способа (из многих других, я уверен). Самый простой способ (благодаря этому вопросу SO) - использовать reverseObjectEnumerator:

NSArray *dateArrayReversed = [[dateArray reverseObjectEnumerator] allObjects];

Или вы можете использовать дескриптор сортировки (messy):

NSArray *arrayOne = [NSArray arrayWithObjects:@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19, nil];

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" ascending: NO];
    NSArray *arrayTwo =  [arrayOne sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];

Другой способ - создать категорию для обратного массива. См. SO вопрос для отличного примера.

Как я могу отменить NSArray в Objective-C?

Ответ 5

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

NSMutableArray *yourArray=[[NSMutableArray alloc] initWithObjects:@"1",@"5",@"10",@"6",@"3",@"11", nil];

NSMutableArray *array=[[NSMutableArray alloc] init];
int count=[yourArray count];
for (int i=0; i<count; i++) {
    [array addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:[[yourArray objectAtIndex:i]intValue]],@"val", nil]];
}

if([array count] > 0){
    NSSortDescriptor * descriptor = [[[NSSortDescriptor alloc] initWithKey:@"val"
                                                                 ascending:NO] autorelease];
    NSArray * sortedArray = [array sortedArrayUsingDescriptors:
                             [NSArray arrayWithObject:descriptor]];
    [array removeAllObjects];
    [array addObjectsFromArray:sortedArray];
}
[yourArray removeAllObjects];
[yourArray release];
NSLog(@"sorted array=%@",array);

Что я делаю в этом, так это то, что сначала добавьте строковые объекты в форме NSNumber в изменяемый словарь, а затем добавьте этот словарь в другой массив. Теперь используйте NSSortDescriptor для сортировки массива в порядке возрастания или убывания.