2010-11-03 96 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