2010-11-03 47 views
1

親愛的所有人。我們有2個數組(currentCarriers和companyList,裏面有字符串)最終的解決方案必須是數組,它將第一個數組中的字符串排除在外 Bellow是我的解決方案,但可能兩個for循環不像可可風格。更好的東西?在兩個NSArrays中優雅比較字符串

for (NSString *carrier in currentCarriers) { 
    for (NSString *company in companyList) 
    { 
     if ([company isEqualToString:carrier]) [removedCompanies addObject:company];  } 
}  

NSMutableArray *companiesForAdd = [NSMutableArray arrayWithArray:companyList]; 
[companiesForAdd removeObjectsInArray:removedCompanies]; 
+0

對我來說看起來很好:) – willcodejavaforfood 2010-11-03 14:11:23

+1

@willcodejavaforfood:O_o對於這個常見問題,這是最糟糕的實現方式(對不起亞歷克斯,不要侮辱)。最好的解決方案將是一個集合的差異,BTW。 – DarkDust 2010-11-03 14:23:42

+0

@DarkDust - 我以爲removeObjectsInArray會做同樣的事情? – willcodejavaforfood 2010-11-03 14:28:19

回答

2

我想你可以擺脫使用的NSArray的-containsObject:方法,一些內環像

for (NSString *carrier in currentCarriers) { 
    if ([companyList containsObject:carrier]) 
     [removedCompanies addObject:company];  
}  

NSMutableArray *companiesForAdd = [NSMutableArray arrayWithArray:companyList]; 
[companiesForAdd removeObjectsInArray:removedCompanies]; 
+0

那裏同樣的東西,對象的不可能是平等的(看我之前的帖子) – Alex 2010-11-03 15:02:34

+0

@亞歷克斯,抱歉不明白... – Vladimir 2010-11-03 15:12:56

+0

數組1有NSString對象1,2,3,數組2有NSString對象3.4。 5。當我嘗試使用removeObjects方法時,它是(我如何理解,比較對象並且不要查看字符串內部)。也許這是錯誤的,但我沒有那種成功,發現2個循環是現在工作。 – Alex 2010-11-03 17:59:44

0

我可以建議兩個選項

  • 如果您擔心性能問題,那麼您可以對數組進行排序,然後一次性創建結果。
  • 如果你不放心,然後使用[companyList containsObject:]
5

打開一個列表只是過濾currentCarriers成可變數組,然後用removeObjectsInArray:,如:

foo = [NSMutableArray arrayWithArray:currentCarriers]; 
[foo removeObjectsInArray:companyList]; 
// foo now contains only carriers that are not in the company list. 

編輯:

替代設置的差異(但可能由於複製/分配而在大多數情況下會變慢):

NSMutableSet *foo = [NSMutableSet setWithArray:currentCarriers]; 
[foo minusSet:[NSSet setWithArray:companyList]]; 

對於較大的列表,這可能會更快,但您失去了排序(如果有)。

+0

這是不正確的。我嘗試過這個。兩個數組中的bcs對象不同,它是來自兩個不同類的不同字符串。 – Alex 2010-11-03 15:01:50

+0

我不明白你的意思,對不起。你的意思是'[string1 isEqual:string2]'在你的情況下會產生false,即使它們有相同的內容? – DarkDust 2010-11-03 16:57:28

+0

據我瞭解,當我嘗試直接使用數組來執行removeObjects時,那裏的對象必須具有相同的對象(相同的對象具有相同的指針)。這不是我現在所擁有的 - 我的數組裏有不同的字符串,字符串裏有不同的對象。所以,當我嘗試從那裏刪除對象,這是沒有任何刪除。 – Alex 2010-11-03 17:58:25