【问题标题】:Check if all objects in an NSArray are identical检查 NSArray 中的所有对象是否相同
【发布时间】:2012-10-11 09:53:13
【问题描述】:

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

这就是我想要的:

假设我有一个包含三个对象的 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");
}

我很确定没有内置的方法可以解决这个问题,而且我不想走繁琐的路线并手动比较每个对象。

谢谢!

【问题讨论】:

    标签: objective-c ios xcode nsarray


    【解决方案1】:

    怎么样

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

    【讨论】:

    • 谢谢,我会测试一下并回复你
    • 它会做更多的工作——因为你要求它创建一组所有可区分的数组项——所以它必须循环遍历数组中的所有项。而要查找所有项目是否相同 - 一旦找到两个不相同的项目,您就可以立即中断。然而,这看起来非常漂亮和优雅......
    【解决方案2】:

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

    - (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)。
    • 有个小bug,循环应该从i=1开始,而不是0。
    • 其实objectAtIndex中应该有i而不是i - 1。更新了我的答案。
    • @johnpatrickmorgan,它实际上并没有将最后一个对象与自身进行比较。假设我们有 5 个对象(索引 0、1、2、3、4)。然后条件为“i
    【解决方案3】:

    建议更快一点,避免在数组为空时抛出异常。应该是 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
    

    【讨论】:

    • 这是不久前的事,但很好的答案!
    【解决方案4】:

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

    - (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 解决方案。

    【讨论】:

    • 这适用于数组中的 NSString 对象,但 NSArray 可以包含任何对象类型。
    • 您将第一个数组元素与其自身进行比较,因此对于非空数组,结果将始终为 NO。
    • @Martin R 你确定吗?首先我取第一个对象,然后将所有对象与第一个值进行比较。包括第一。如果它们不匹配 = 则返回 NO。
    • @Enrique 是的,你是对的,但我正在回复有问题的示例,其中仅包含字符串。
    • @GuntisTreulands:你是对的,我的评论错了,对不起。
    猜你喜欢
    • 2015-11-10
    • 2020-12-27
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2012-05-20
    • 2021-10-29
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多