我在互联网上搜索了这个,但没找到解决方案......
这就是我想要的:
假设我有一个带有三个对象的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");
}
我很确定没有内置的方法,而且我宁愿不采取繁琐的路线并手动比较每个对象。
谢谢!
答案 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 解决方案。