检查NSArray中的所有对象是否相同

时间:2012-10-11 09:53:14

标签: objective-c ios xcode nsarray

我在互联网上搜索了这个,但没找到解决方案......

这就是我想要的:

假设我有一个带有三个对象的NSArray。这三个对象是:

{

@"Hi",
@"Hi",
@"Hi"

 }

在这种情况下,数组包含三个字符串,它们都是相等的。

我想为此作证,我想创建一个循环遍历所有对象的NSArrayBOOL方法,如果它们全部相同则返回YES。这是一个例子:

NSArray *array = [[NSArray alloc] initWithObjects: @"Object", @"Object", @"Object", nil];

if ([array allObjectsAreIdentical /* method I would have to create */) {

     NSLog(@"All objects in this array are identical");
}

我很确定没有内置的方法,而且我宁愿不采取繁琐的路线并手动比较每个对象。

谢谢!

4 个答案:

答案 0 :(得分:8)

怎么样?
NSSet *set = [NSSet setWithArray:array];
if ([set count] == 0) {
     // array is empty. Does that count as identical ?
} else if ([set count] == 1) {
     // all objects in array are identical
} else {
     // there are different objects
}

编辑:写为NSArray类别方法,这将是

-(BOOL) allObjectsAreIdentical
{
    NSSet *set = [NSSet setWithArray:self];
    return ([set count] <= 1);
}

注意:您应该知道此解决方案(即使它可能看起来优雅)比较数组中的更多对象。因此,如果性能问题,最好采用其他解决方案,例如: @dieworld提出的那个。

答案 1 :(得分:5)

在资源和时间方面更便宜(我希望):

- (BOOL) allObjectsAreIdentical
{
    if (self.count < 2) return YES;
    for (int i = 0; i < self.count - 1; i++) {
        if (![[self objectAtIndex: i] isEqual: [self lastObject]]) return NO;
    }
    return YES;
}

假设一个对象总是等于它自己,零对象也是相等的。

答案 2 :(得分:1)

建议加快一点,避免在数组为空时抛出异常。应该是一般可用的NSArray类别。除非至少有两个元素,否则不要检查在调用isEqual:之前检查对象指针,假设通常相等的对象实际上是同一个对象。

@interface NSArray (objectsAreIdentical)
- (BOOL)allObjectsAreIdentical;
@end

@implementation NSArray (objectsAreIdentical)

- (BOOL)allObjectsAreIdentical
{
    BOOL result = YES;
    if (self.count >= 2)
    {
        id firstObject = self [0];
        for (id object in self)
        {
            if (firstObject != object && ! [firstObject isEqual:object])
            {
                result = NO;
                break;
            }
        }
    }

    return result;
}
@end

答案 3 :(得分:0)

我的建议是(只是把它放在这里......以防万一):

- (BOOL)allObjectsAreIdenticalInArray:(NSArray *)mArray
{
    if(!mArray || ![mArray count])
    {
        return YES;//if it is empty
    }

    NSString *mTestString = [mArray objectAtIndex:0];

    for(NSString *mString in mArray)
    {
        if(![mTestString isEqalToString:mString])
        {
            return NO; //we found atleast one who isnt.
        }
    }

    return YES; //everything checks out - they all are the same.
}

但我会选择 Martin R 解决方案。