2011-09-26 135 views
1

我正在循環訪問數組,並將此數組中的對象標記屬性與另一個數組中的對象進行比較。這個2x快速枚舉的更好的解決方案?

這裏是我的代碼:

NSArray *objectsArray = ...; 
NSArray *anotherObjectArray = ...; 
NSMutableArray *mutableArray = ...; 

for (ObjectA *objectA in objectsArray) { 
    for (ObjectZ *objectZ in anotherObjectArray) { 
     if ([objectA.tag isEqualToString:objectZ.tag]) { 
      [mutableArray addObject:objectA]; 
     } 
    } 
} 

有沒有更好的方式來做到這一點?

請注意tag屬性不是整數,所以必須比較字符串。

+3

對不起,但如果正在使用對象A? – mackworth

+1

或者類似的,'childParent'是什麼? –

+0

哦,還有一個:你爲什麼要優化?這段代碼是否被執行了很多,或者objectsArray或[childParent children]或者兩者都有很多元素? – mackworth

回答

5

您可以通過遍歷每個陣列一次,而不是嵌套做到這一點:

NSMutableSet *tagSet = [NSMutableSet setWithCapacity:[anotherObjectArray count]]; 

for(ObjectZ *objectZ in antherObjectArray) { 
    [tagSet addObject:objectZ.tag]; 
} 

NSMutableArray *output = [NSMutableArray mutableArray]; 

for(ObjectA *objectA in objectsArray) { 
    if([tagSet containsObject:objectA.tag]) { 
     [output addObject:objectA]; 
    } 
} 
+0

但是,不包含對象(和indexOfObject)只是內部遍歷整個集合或數組呢? – mackworth

+0

indexOfObject必須遍歷數組,但containsObject是常量時間。 –

+0

夥計,你真棒。這將我的解析時間減少了50%(顯然這是一個重要的循環)。非常聰明! – runmad

1

好,最簡單的變化(如只能有每個對象A一場比賽),那麼你可以以後做一個打破你的[mutableArray addObject:objectA]。當匹配發生時,這會將內部循環減少50%。

更爲顯着的是,如果你這樣做了很多,並且anotherObjectArray的順序並不重要,那就是顛倒你的anotherObjectArray數據結構並使用字典,通過標記存儲對象。然後,您只需遍歷objectA,詢問它的標記是否在ObjectZs的字典中。

1

也許你可以使用[NSArray filteredArrayUsingPredicate:]; - http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

但是,您可能必須自己調整屬性標記。

NSArray *objectsArray = [NSArray arrayWithObjects:@"Miguel", @"Ben", @"Adam", @"Melissa", nil]; 
NSArray *tagsArray = [NSArray arrayWithObjects:@"Miguel", @"Adam", nil]; 

NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF IN %@", tagsArray]; 
NSArray *results = [objectsArray filteredArrayUsingPredicate:sPredicate]; 
NSLog(@"Matched %d", [results count]); 
for (id a in results) { 
    NSLog(@"Object is %@", a); 
} 

希望這有助於

0

感謝所有的答案。雖然我已經接受了的NSMutableSet的解決方案,其實我結束了與下面去,因爲它變成了它是一點點更快:

NSMutableDictionary *tagDictionary = [NSMutableDictionary dictionaryWithCapacity:[anotherObjectArray count]]; 
for (ObjectZ *objectZ in anotherObjectArray) { 
    [tagDictionary setObject:objectZ.tag forKey:objectZ.tag]; 
    } 
for (ObjectA *objectA in objectsArray) { 
    if ([tagDictionary objectForKey:objectA.tag]) { 
     [direction addObject:objectA]; 
    } 
}