【问题标题】:Algorithm for unique objects from an array with sub-objects?具有子对象的数组中唯一对象的算法?
【发布时间】:2011-11-15 00:00:30
【问题描述】:

我有一个数据类:

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

跟班:

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

还有一个数组:

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

如何创建一个包含基于引擎“power”的所有唯一项目的新数组?

例如:

0 带发动机的汽车(功率 = 20,名称 = “发动机一号”)

1 辆带发动机的汽车(功率 = 45,名称 = “发动机 2”)

2 带发动机的汽车(功率 = 20,名称 = “发动机三”)

最终数组将是汽车对象 0 和 1

两个数据类都有访问器,例如:

- (NSInteger)power;

【问题讨论】:

    标签: iphone objective-c ios nsmutablearray nsarray


    【解决方案1】:
    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];
    }
    

    【讨论】:

    • 一会儿试试...顺序并不重要,只要它是独一无二的
    • @Javy:更新答案以涵盖“第一次出现”。
    • 这似乎是对一个引擎数组进行排序,但我有一个汽车对象数组,其中包含具有功率属性的引擎对象......所以这只会对一个引擎对象数组进行排序,对吗?
    • 哦,对不起,那你的问题看错了。更新了答案。现在应该可以满足您的需求了。
    • 是的,完美...我肯定会进一步研究这些方法。非常感谢。
    【解决方案2】:

    枚举数组,建立一个索引列表,其对象具有以前未见过的power 值。

    创建一个集合来保存已经见过的powers; -[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];
    

    【讨论】:

    • 感谢您的帮助,但我使用的是 Regexident 的代码。感谢您的帮助。
    猜你喜欢
    • 2017-11-16
    • 2018-08-10
    • 2017-02-21
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多