2

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

这是我想要的:

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

{

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

 }

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

我想证明这一点,我想创建一个循环遍历所有对象的NSArray类别BOOL方法,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

4 回答 4

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 提出的解决方案。

于 2012-10-11T09:57:14.263 回答
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;
}

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

于 2012-10-11T10:04:18.080 回答
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
于 2014-03-12T17:42:35.663 回答
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解决方案。

于 2012-10-11T10:00:53.110 回答