2012-02-07 57 views
0

我有一個Place對象的數組。每個Place對象都有一個namecode屬性,都是字符串。每個Place對象已具有code,但我需要從服務器中查找name屬性。我找回2個數組:一個包含名稱,其他代碼。這些陣列是這樣排列的,以使nameArray中某個索引處的namecodeArray的相同索引處的code完全對應。最快的方法來比較/設置字符串

我已被循環通過Place對象數組,然後檢查,看是否code屬性爲Place是一樣的,在codeArray當前索引。如果是,我設置PlacenamenameArray使用相同指數:

for(int i = 0; i < [placesArray count]; i++) 
{ 
    for(int j = 0; j < [codeArray count]; j++) { 

     if([[[placesArray objectAtIndex:i] code] isEqualToString:[codeArray objectAtIndex:j]]) { 
      [[placesArray objectAtIndex:i] setName:[nameArray objectAtIndex:j]]; 
     } 
    } 
} 

這工作,但不是非常快 - 它需要30秒,通過1000+的地方循環。

有沒有更快的方法?

回答

1

,你應該使用儀器,找出瓶頸實際上是分析代碼。也就是說,循環遍歷namesArray中的每個名字的placesArray並進行字符串比較效率相當低。

這樣的事情呢?

NSMutableDictionary *placesByCode = [NSMutableDictionary dictionaryWithCapacity:[placesArray count]]; 
for (Place *aPlace in placesArray) { 
    [dictionary setObject:aPlace forKey:aPlace.code]; 
} 

NSMutableDictionary *namesByCode = [NSMutableDictionary dictionaryWithCapacity:[namesArray count]]; 
for (int i=0; i<[namesArray count]; i++) { 
    NSString *name = [namesArray objectAtIndex:i]; 
    NSString *code = [codeArray objectAtIndex:i]; 
    [namesByCode setObject:name forKey:code]; 
} 

for (NSString *code in namesByCode) { 
    Place *place = [placesByCode objectForKey:code]; 
    place.name = [namesByCode objectForKey:namesByCode]; 
} 

仰望它的字典中的代碼中的每個地方應該是頗有幾分比通過整個陣列的地方爲每名手動循環更快。

+0

我已經介紹了這一點,並且看到'isEqualToString:'被調用了很多。我已經嘗試過您的解決方案,並且性能提高了約96%。你搖滾安德魯。 – colby 2012-02-07 18:26:58

0

與任何時候你想優化性能,您可以使用的NSArray -containsObject

if ([myarray containsObject:myObject]) { 
    // ... 
} 
+0

我修改了我的代碼以使用'containsObject:',並且性能提高了〜60%。雖然他的解決方案增加了96%,但我已經標記了Andrew的正確率。 – colby 2012-02-07 18:28:49

0

嘗試在內部循環中使用break語句。這樣你就不需要每次循環整個循環。

for(int i = 0; i < [placesArray count]; i++) 
{ 
    for(int j = 0; j < [codeArray count]; j++) { 

     if([[[placesArray objectAtIndex:i] code] isEqualToString:[codeArray objectAtIndex:j]]) { 
      [[placesArray objectAtIndex:i] setName:[nameArray objectAtIndex:j]]; 
      break; 
     } 
    } 
} 

你也可以將第二陣列變得小,因爲你找到更多的結果。它會花費你更多的內存,但1000個字符串不是很多。

NSMutableArray * tempCodeArray = [NSMutableArray arrayWithArray:codeArray]; 
for(int i = 0; i < [placesArray count]; i++) 
{ 
    for(int j = 0; j < [tempCodeArray count]; j++) { 

     if([[[placesArray objectAtIndex:i] code] isEqualToString:[tempCodeArray objectAtIndex:j]]) { 
      [[placesArray objectAtIndex:i] setName:[nameArray objectAtIndex:j]]; 
      [tempCodeArray removeObjectAtIndex:j]; 
      break; 
     } 
    } 
} 
0

問題不爲陣列的計數,它的嵌入式for循環將採取爲O(n * n)和在Andrew的溶液,這只是爲O(n)+ O(n)的+ O( n)+無論在字典中找到關鍵字的對象,我想這將在哈希表查找中,而且非常快。

科爾比,你可能會接受安德魯的解決方案。如果你仍然想提高性能,那麼一個好主意就是將數組排序,然後進行查找。

希望這會有所幫助。