2010-11-03 50 views
0

我想比较两个数组,数组说一个是像这样一个系列阵列:的NSMutableArray containsObject问题

((1,1), (1,2), (1,3), (1,4), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3)) 

和数组b是像这样一系列的数组:

((1,1), (1,2), (1,3), (1,4), (2,1), (2,2), (2,3)) 

如何检查是否从阵列中的一个项目是不是数组b内

for(NSString* itemFromA in a) { 
if ([b containsObject: itemFromA] == FALSE) { 
    NSLog(@"ok"); 
    break; 
} 
} 

这似乎并没有为我工作。

+1

请妥善格式化您的问题(格式化您的代码,以便它可以被读取)。此外,由于您的描述与您的代码不完全匹配,因此不清楚您要问什么。你的for循环使它看起来像你的数组A和B包含NSString实例,但是你的描述建议每个数组都包含未标识的东西(一个字符串?一个数字?一个包含NSRange结构的NSValue?)的数组。请澄清确切的结构。 – 2010-11-03 17:44:49

+0

你应该*永远不*与* false *比较。始终使用! '![b containsObject:itemFromA]'。在与* false *进行比较的情况下,这没有什么区别。你不允许做*,与*真*相比。顺便说一句:在Objective-C中,使用* YES *和* NO *代替* true *和* false *。 – 2010-11-03 17:55:03

+0

@Georg:虽然我同意BOOL的YES/NO,但if ([b containsObject:itemFromA] == NO)完全有效。 -containsObject:返回一个BOOL,所以就像说BOOL isThere = YES; if(isThere == NO)...与if(!isThere)相同。 – 2010-11-03 17:59:11

回答

0

我不确定迭代器类型是否正确;听起来像ba是数组的数组,但是您使用NSString*作为迭代器类型。我不是Objective-C的内部神童,但我相信,这将导致你的检查失败(如itemFromANSString*类型的,你是通过NSArray*个集合迭代。)

此外containsObject:不得做你想做的事情,即它使用isEqual来执行比较。在文档中提到isEqual专门用于NSArray,但我无法找到有关该专业化的详细信息。我不知道containsObject:在这种“深度”的比较操作中会如何。

+0

由于Objective-C的动态特性,即使指定了错误的数据类型,代码也会调用正确的方法。 – 2010-11-03 17:50:14

+2

我不认为这在运行时很重要,因为NSArray和NSString都是NSObject的子类,它包含相等和散列方法。因为数组中的所有元素都会用它们自己的实现来回答这些问题,所以无论你给什么类来存放指针,它们的行为都是一样的。问题是,我们完全不知道确切的结构是基于问题/代码的。这很重要,因为例如NSArray的-isEqual:依赖于不同于NSString的标准。 – 2010-11-03 17:50:21

+0

事实上,指针的静态类型并不决定使用哪种实际的方法实现 - 这将在运行时由实例的动态类型确定。 – 2010-11-03 18:38:23

0

我解决了这个问题,尽管随时可以清理它。

@implementation AppController的 - (IBAction为)GetArrayData:(ID)发送方{

int a=10; 
int b=10; 
int c=20; 
int d=20; 
int row=0; 
int col=0; 

NSMutableArray* e = [[NSMutableArray alloc] init]; 
NSMutableArray* f = [[NSMutableArray alloc] init]; 

for(row=0; row<a; row++) { 
    for(col=0; col<b; col++) { 
     NSNumber* thisrow = [NSNumber numberWithInt:row]; 
     NSNumber* thiscol = [NSNumber numberWithInt:col]; 
     [e addObject:[NSArray arrayWithObjects:thisrow, thiscol, nil]]; 
    } 
} 

for(row=0; row<c; row++) { 
    for(col=0; col<d; col++) { 
     NSNumber* thisrow = [NSNumber numberWithInt:row]; 
     NSNumber* thiscol = [NSNumber numberWithInt:col]; 
     [f addObject:[NSArray arrayWithObjects:thisrow, thiscol, nil]]; 

    } 
} 

//check to see if f contains items from e 
for(NSString* thisset in f) { 
    if ([e containsObject: thisset]) { 
     NSLog(@"This set (%@) is already being used.", thisset); 
    } else { 
     NSLog(@"We can start the ad at these coordinates: %@", thisset); 
     break; 
    } 
} 

[E释放]; [f版本]; } @end