Сортировка NSArray с использованием другого NSArray в качестве ориентира

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

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

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


person cannyboy    schedule 21.10.2010    source источник


Ответы (2)


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

 NSDictionary *dict = [NSDictionary dictionaryWithObjects:colors forKeys:shapes];
 NSArray *sortedShapes = [dict keysSortedByValueUsingSelector:@selector(localizedCompare:)];
person Daniel Dickison    schedule 21.10.2010
comment
Ответ dreamlax определенно является более чистым и более общим решением (работает с любым количеством массивов, а не только с двумя). Я думаю об этом как о более быстром взломе. - person Daniel Dickison; 22.10.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 Dickisons.

person dreamlax    schedule 21.10.2010