从带有子对象的数组中获取唯一对象的算法?

发布于 2024-12-15 16:18:16 字数 576 浏览 3 评论 0原文

我有一个数据类:

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

I have a data class:

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

With the class:

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

And an array:

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

How would I make a new array that contains all unique items based on Engine 'power'?

For Example:

0 Car with Engine ( power = 20, name = "engine one" )

1 Car with Engine ( power = 45, name = "engine two" )

2 Car with Engine ( power = 20, name = "engine three" )

Final array would be car objects 0 and 1

Both data classes have accessors, e.g:

- (NSInteger)power;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迷途知返 2024-12-22 16:18:16
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];
}
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];

Will pick the last item per engine power.

To get the first one replace the line

[carsByUniqueEnginePowers setObject:car forKey:enginePower];

with this:

if (![carsByUniqueEnginePowers objectForKey:power]) {
    [carsByUniqueEnginePowers setObject:car forKey:enginePower];
}
嘦怹 2024-12-22 16:18:16

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

创建一个集合来保存已经看到的power-[NSArrayindexsOfObjectsPassingTest:] 处理构建索引列表。然后向原始数组询问其 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];

Enumerate the array, building up a list of indices whose objects have previously-unseen power values.

Create a set to hold the already-seen powers; -[NSArray indexesOfObjectsPassingTest:] handles building the index list. Then ask the original array for its 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];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文