从目标c中的数组中删除重复项

时间:2010-10-24 07:33:50

标签: objective-c nsarray unique

我有一个包含自定义对象的数组。每个数组项都有一个名为“name”的字段。现在我想根据此名称值删除重复的条目。

我应该如何实现这一目标。

提前致谢。

8 个答案:

答案 0 :(得分:28)

我不知道框架提供的任何标准方法。所以你必须在代码中做到这一点。这样的事情应该是可行的:

NSArray* originalArray = ... // However you fetch it
NSMutableSet* existingNames = [NSMutableSet set];
NSMutableArray* filteredArray = [NSMutableArray array];
for (id object in originalArray) {
   if (![existingNames containsObject:[object name]]) {
      [existingNames addObject:[object name]];
      [filteredArray addObject:object];
   }
}

答案 1 :(得分:9)

您可能必须自己编写此过滤方法:

@interface NSArray (CustomFiltering)
@end

@implementation NSArray (CustomFiltering) 

- (NSArray *) filterObjectsByKey:(NSString *) key {
   NSMutableSet *tempValues = [[NSMutableSet alloc] init];
   NSMutableArray *ret = [NSMutableArray array];
   for(id obj in self) {
       if(! [tempValues containsObject:[obj valueForKey:key]]) {
            [tempValues addObject:[obj valueForKey:key]];
            [ret addObject:obj];
       }
   }
   [tempValues release];
   return ret;
}

@end

答案 2 :(得分:7)

我知道这是一个老问题,但这是另一种可能性,取决于你需要什么。

Apple确实提供了一种方法 - Key-Value Coding Collection Operators

对象运算符允许您对集合执行操作。在这种情况下,您需要:

@distinctUnionOfObjects

  

@distinctUnionOfObjects运算符返回一个数组,该数组包含由运算符右侧的键路径指定的属性中的不同对象。

NSArray *distinctArray = [arrayWithDuplicates valueForKeyPath:@"@distinctUnionOfObjects.name"];

但是,在你的情况下,你需要整个对象。所以你必须做的是双重的: 1)改为使用@distinctUnionOfArrays。例如。如果您有来自其他集合的这些自定义对象,请使用@distinctUnionOfArray.myCollectionOfObjects 2)如果这些对象的名称相等,则对这些对象实施isEqual:

答案 3 :(得分:2)

我会因此而受到抨击......

您可以将数组转换为字典。不确定这有多高效,取决于实现和比较调用,但确实使用了哈希映射。

//Get unique entries
NSArray *myArray = @[@"Hello", @"World", @"Hello"];
NSDictionary *uniq = [NSDictionary dictionaryWithObjects:myArray forKeys:myArray];
NSLog(@"%@", uniq.allKeys);

*注意,这可能会改变数组的顺序。

答案 4 :(得分:1)

如果您希望自定义NSObject子类的名称相等,则可以实现isEqual:hash。这将允许您将对象添加到NSSet / NSMutableSet(一组不同的对象)。

然后,您可以使用NSArray的{​​{1}}方法轻松创建排序NSSet

MikeAsh写了一篇关于实现自定义平等的非常可靠的文章:Friday Q&A 2010-06-18: Implementing Equality and Hashing

答案 5 :(得分:1)

如果您担心订单

NSArray * newArray =
        [[NSOrderedSet orderedSetWithArray:oldArray] array]; **// iOS 5.0 and later** 

答案 6 :(得分:1)

一行很简单

t
  

如果你不关心元素顺序那么(无序)

NSArray *duplicateList = ... 
  

按顺序保存元素然后(有序)

NSArray *withoutDUP1 = [[NSSet setWithArray:duplicateList] allObjects];

答案 7 :(得分:0)

实施isEqual以使您的对象具有可比性:

@interface SomeObject (Equality)
@end

@implementation SomeObject (Equality)

- (BOOL)isEqual:(SomeObject*)other
{
    return self.hash == other.hash;
}

- (NSUInteger)hash
{
    return self.name;///your case
}

@end

使用方法:

- (NSArray*)distinctObjectsFromArray:(NSArray*)array
{
    return [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
}