Сортировка NSArray с использованием другого NSArray в качестве руководства - PullRequest
3 голосов
/ 22 октября 2010

Итак, представьте, что у вас есть пара массивов, цветов и форм, например:

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];

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

Ответы [ 2 ]

9 голосов
/ 22 октября 2010

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

 NSDictionary *dict = [NSDictionary dictionaryWithObjects:colors forKeys:shapes];
 NSArray *sortedShapes = [dict keysSortedByValueUsingSelector:@selector(localizedCompare:)];
1 голос
/ 22 октября 2010

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

  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.

...