2014-07-04 118 views
1

我目前正在學習Objective-C。我正在學習的這本書給了我一個挑戰,在這裏我給了兩個數組,我應該創建一個程序來顯示在這兩個數組中列出的對象。Objective-C兩個陣列之間的匹配對象

我已經設置好了一切,唯一困難的是比較兩個數組並返回兩個數組中出現的內容。他們都是很長的名單,而我所有的嘗試都沒有出現,甚至崩潰。

如何做到這一點的任何幫助將是偉大的。

編輯:這是我到目前爲止所做的...我不能舉出我之前嘗試過的例子,因爲我會使用諸如isEqualToString:,predicateWithFormat:之類的東西,並且在它沒有我會刪除代碼。

我很抱歉,如果我的代碼包含明顯的錯誤,讓我再次提到我是新的。

{ @autoreleasepool {

// Read in a file as a huge string (ignoring the possibility of an error) 
    NSString *nameString = 
    [NSString stringWithContentsOfFile:@"/usr/share/dict/propernames" 
           encoding:NSUTF8StringEncoding 
           error:NULL]; 
    // Read in a file for words 
    NSString *wordString = 
    [NSString stringWithContentsOfFile:@"/usr/share/dict/words" 
    encoding:NSUTF8StringEncoding 
    error:NULL]; 


    // Break it into an array of strings 
    NSArray *namesArray = [nameString componentsSeparatedByString:@"\n"]; 

    // Break words into an array of strings 
    NSArray *wordArray = [wordString componentsSeparatedByString:@"\n"]; 



    // Go through the array one string at a time 
    for (NSString *n in namesArray) { 

     // Here is where I'm at 


    } 
} 

}

+0

的可能的複製[this](http://stackoverflow.com/a/1138417/1215715) – Ryan

+0

請提供您嘗試過的示例代碼。 – sarin

回答

5

有很多方法。一個直接的一個,但不是很有效:

NSArray* array1 = /* ... */; 
NSArray* array2 = /* ... */; 
NSMutableArray* common = [NSMutableArray array]; 
for (id obj in array1) 
{ 
    if ([array2 containsObject:obj]) 
     [common addObject:obj]; 
} 

鑑於陣列大,反覆查找使用-contains:將是昂貴的。它必須搜尋array1中每個項目的全部array2

之類的查找更加高效使用一組,所以你可能會做:

NSArray* array1 = /* ... */; 
NSArray* array2 = /* ... */; 
NSSet* set = [NSSet setWithArray:array2]; 
NSMutableArray* common = [NSMutableArray array]; 
for (id obj in array1) 
{ 
    if ([set containsObject:obj]) 
     [common addObject:obj]; 
} 

這可以更簡單,可能通過使用集合運算速度更快。手頭的任務基本上是交集(假設你不關心最終收集的通用物品的順序)。所以,你可以這樣做:

NSArray* array1 = /* ... */; 
NSArray* array2 = /* ... */; 
NSSet* set1 = [NSSet setWithArray:array1]; 
NSMutableSet* common = [NSMutableSet setWithArray:array2]; 
[common intersectSet:set1]; 

如果你正在尋找一個班輪,你可以用NSPredicate做到這一點,雖然,再次,它可能不是非常高效:

NSArray* array1 = /* ... */; 
NSArray* array2 = /* ... */; 
NSArray* common = [array1 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self IN %@", array2]]; 
0

這裏是僞代碼,希望這將幫助你瞭解你怎麼也得工作:

ArrayA=[1,2,3,4]; 
ArrayB=[2,3,4,5]; 

for (int i =0; i< [ArrayA count]; i++) 
{ 
    if ([[ArrayA objectAtIndex:i] isEqual: [ArrayB objectAtIndex:i]]) 
    { 
     NSLog(@"the same"); 
     [<add same object> to ResultArray]; 
    } 
} 
+1

這隻能找到兩個數組中相同位置的對象。特別是在你顯示的數組中,它將找不到任何匹配的數組。我不認爲這就是問題所在。 –

+0

哦,是的......你是對的...... – iphonemaclover