比较/设置字符串的最快方法

时间:2012-02-07 17:37:39

标签: iphone objective-c ios ipad

我有一组Place个对象。每个Place对象都有namecode属性,两个字符串。每个Place对象已经有code,但我需要从服务器中查找name属性。我找回了2个数组:一个包含名称,另一个包含其他代码。对这些数组进行排序,以使name中某个索引处的nameArraycode的相同索引处的codeArray完全对应。

我一直在循环遍历Place个对象,然后检查code的{​​{1}}属性是否与Place中的当前索引相同}。如果是,我使用codeArray中的相同索引设置name的{​​{1}}:

Place

这可行但速度不是很快 - 1000多个地方可能需要30秒才能完成。

有更快的方法吗?

4 个答案:

答案 0 :(得分:1)

与您尝试优化性能的任何时候一样,您应该使用Instruments对代码进行分析,以找出瓶颈实际存在的位置。也就是说,在nameArray中为每个名称循环遍历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];
}

通过字典中的代码查找每个地方应该比为每个名称手动循环整个地方数组要快得多。

答案 1 :(得分:0)

您可以使用NSArray -containsObject

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

答案 2 :(得分: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;
       }
    }
}

答案 3 :(得分:0)

问题不在于数组的计数,它是嵌入式for循环,需要O(n * n),在Andrew的解决方案中,它只有O(n)+ O(n)+ O(n)+无论如何在字典中查找密钥的对象,我想这将在哈希表查找中,并且非常快。

科尔比,你可能会对安德鲁的解决方案感到满意。如果你仍然希望提高性能,那么一个好主意就是首先对数组进行排序然后进行查找。

希望这会有所帮助。