Алгоритм для уникальных объектов из массива с подобъектами? - PullRequest
1 голос
/ 15 ноября 2011

У меня есть класс данных:

@interface Car : NSObject
{
  Engine *_engine;
}
//...

С классом:

@interface Engine : NSObject
{
  NSInteger _power;
  NSString *_name;
}
//...

и массив:

NSArray *myArray = [ // a bunch of Car objects with Engines

Как создать новый массив, содержащий все уникальные элементы, основанные на мощности двигателя?

Например:

0 Автомобиль с двигателем (мощность = 20, название = "двигатель один")

1 Автомобиль с двигателем (мощность = 45, название = "двигатель два")

2 Автомобиль с двигателем (мощность = 20, название = "двигатель три")

Конечным массивом будут объекты автомобилей 0 и 1

Оба класса данных имеют средства доступа, например:

- (NSInteger)power;

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011
NSArray *cars = ...;
NSMutableDictionary *carsByUniqueEnginePowers = [NSMutableDictionary dictionary];
for (Car *car in cars) {
    NSNumber *enginePower = [NSNumber numberWithInteger:car.engine.power];
    [carsByUniqueEnginePowers setObject:car forKey:enginePower];
}
NSArray *carsWithUniqueEnginePowers = [carsByUniqueEnginePowers allValues];

Выберет последний элемент на мощность двигателя.

Чтобы получить первый, замените строку

[carsByUniqueEnginePowers setObject:car forKey:enginePower];

с этим:

if (![carsByUniqueEnginePowers objectForKey:power]) {
    [carsByUniqueEnginePowers setObject:car forKey:enginePower];
}
1 голос
/ 15 ноября 2011

Перечислить массив, составив список индексов, чьи объекты имеют ранее невидимые power значения.

Создать набор для хранения уже увиденных power с; -[NSArray indexesOfObjectsPassingTest:] обрабатывает создание списка индексов. Затем спросите исходный массив для его objectsAtIndexes:.

NSMutableSet * powerSet = [NSMutableSet set];
NSIndexSet * indexes;
indexes = [carArr indexesOfObjectsPassingTest:^BOOL(id car, NSUInteger idx, BOOL *stop) {
                  // valueForKey: will return an NSNumber instance for scalar values.        
                  NSNumber * powerNum = [[car engine] valueForKey:@"power"];
                  // This power is already in the set; pass over this car.
                  if( [powerSet containsObject:powerNum] ){
                      return NO;
                  }
                  // Add the new power to the set and include this car in the index set.        
                  else {
                      [powerSet addObject:powerNum];
                      return YES;
                  }
              }];
NSArray * uniqueEnginePowerCars = [carArr objectsAtIndexes:indexes];
...