2015-09-25 2 views
0

У меня есть массив значений, и я бы хотел сортировать его с самых высоких до самых низких значений. Вот мой массив:Сортировка NSArray с сохранением исходных индексов, а не значений

@[@0.985517248005697843460382, @0.000103821940243745174581, @0.002930049254083499140483, @0.006089428685598983863325, @0.000169959081717878927225 @0.038708805305937427077012, @0.005785644142951103588435, @0.003949420720490224266663 @0.003306789895982742942537, @0.005520713777168946394258]; 

Какой самый эффективный способ создать новый массив, но вместо того, чтобы содержать отсортированные значения, он будет содержать индексы из исходного массива?

В настоящее время это то, что я делаю:

NSArray *array = @[@3, @5, @7, @2, @4, @4.1, @1, @10]; 
NSArray *sortedArray = [array sortedArrayUsingSelector: @selector(compare:)]; 
NSMutableArray *arraySortedByOriginalIndexes = [[NSMutableArray alloc] init]; 
for (int i = 0; i < sortedArray.count; i++) { 
    NSUInteger index = [array indexOfObject:sortedArray[i]]; 
    [arraySortedByOriginalIndexes addObject:@(index)]; 
} 
+0

Это 'NSNumbers' типа' double'. Я отправлю пример через 2 мин. – KingPolygon

ответ

2

Вот простое решение, если нет числа в массиве не равны.

NSArray *sortedArray = [array sortedArrayUsingSelector: @selector(compare:)]; 

NSMutableArray *mutableIndexes = [NSMutableArray array]; 
for (NSNumber *number in sortedArray) { 
    [mutableIndexes addObject:@([array indexOfObject:number])]; 
} 
NSArray *indexes = [mutableIndexes copy]; 

Опять же, он работает только тогда, когда числа не равны.

+0

Спасибо, Джеффри! Можно ли доверять Fast Enumeration с точки зрения гарантии заказа? В случае, если 2 числа равны, возвращает ли он первый найденный? – KingPolygon

+0

Какова точка '[mutableIndexes copy]'? Вы действительно хотите '[NSArray arrayWithArray: mutableIndexes]'? – Paulw11

+1

@KingPolygon Он может для массива – Paulw11