2012-10-11 120 views
2

我已搜查这个在互联网上,但没有发现任何解决方案...检查是否在一个NSArray所有的对象都相同

下面是我想:

说我有一个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"); 
} 

我敢肯定,没有内置在该方法的,也是我宁愿不走繁琐的路线和手动比较每个对象。

谢谢!

回答

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提出的。

+0

谢谢,我会测试这一点,并尽快给您 – MCKapur

+0

它会做更多的工作 - 因为你问它来创建一组阵列的所有区别的项目 - 因此它通过所有的项目都必须环在数组中。而找到所有项目是否相同 - 只要找到两个不相同的部分,就可以中断。然而,这看起来非常漂亮和优雅...... –

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. 
} 

但我会马丁 - [R解去。

+2

这将适用于数组中的NSString对象,但NSArray可以包含任何对象类型。 – Enrique

+1

您将第一个数组元素与自身进行比较,因此对于非空数组,结果始终为NO。 –

+0

@Martin R你确定吗?首先,我先取对象,然后将所有对象与第一个值进行比较。包括第一。如果他们不匹配=那么它返回NO。 –

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

假设一个对象总是等于本身和零个对象也是相等的。

+1

你说得对,你的解决方案比我的(+1)需要更少的比较操作。 –

+0

有一个小错误,循环应该从i = 1开始,而不是从0开始。 – KamilPyc

+0

实际上,'objectAtIndex'应该有'i'而不是'i-1'。更新了我的答案。 – dieworld

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 
+0

这是前一段时间,但是很好的答案! – MCKapur

相关问题