2010-10-21 2 views
3

Итак, представьте, у вас есть несколько массивов, цвет и форма, как это:Сортировка NSArray с использованием другого NSArray в качестве руководства

Colors: { 
Yellow, 
Blue, 
Red 
} 

Shapes: { 
Square, 
Circle, 
Diamond 
} 

Теперь, если я хочу, чтобы отсортировать цвета в алфавитный порядок, что я могу сделать что-то вроде этого:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES selector:@selector(localizedCompare:)]; 
NSArray *sortedColors = [colors sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
[sortDescriptor release]; 

Но как бы я сортировал фигуры в том же порядке, что и я изменил порядок цветов. Я не имею в виду, что Shapes в алфавитном порядке - я имею в виду, что Shapes в алфавитном порядке цветов ...?

ответ

9

Самый простой способ, вероятно, это:

NSDictionary *dict = [NSDictionary dictionaryWithObjects:colors forKeys:shapes]; 
NSArray *sortedShapes = [dict keysSortedByValueUsingSelector:@selector(localizedCompare:)]; 
+1

Ответ dreamlax определенно является «более чистым» и более общим решением (работает с любым количеством массивов, а не только с двумя). Я думаю, что это скорее быстрый хак. –

1

Если цвета в паре с массивами, возможно, вам следует использовать только один массив вместо двух. Например, вы можете структурировать свои данные таким образом, чтобы вы могли запрашивать форму и цвет объекта с использованием одного индекса. Есть по крайней мере несколько способов добиться этого.

  1. Используйте массив словарей, каждый словарь содержит две пары ключ-значение, ShapeKey и ColourKey. После того, как вы установили эту структуру, вы можете использовать:

    NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"ColourKey" ascending:YES]; 
    NSArray *sortedByColours = [colours sortedArrayUsingDescriptors:[NSArray arrayWithObject:sd]; 
    [sd release]; 
    
  2. Определение пользовательского класса с двумя свойствами, colour и shape. Если вы используете этот подход, вы можете использовать приведенный выше код, но просто замените @"ColourKey" на @"colour" (или что бы вы ни выбрали для вызова этого свойства).

Если вы настаиваете на сохранении двух отдельных массивов, идут с ответом @Daniel Dickison ' сек.