Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 比较/设置字符串的最快方法_Iphone_Objective C_Ios_Ipad - Fatal编程技术网

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

Iphone 比较/设置字符串的最快方法,iphone,objective-c,ios,ipad,Iphone,Objective C,Ios,Ipad,我有一个Place对象数组。每个Place对象都有一个name和code属性,这两个属性都是字符串。每个Place对象已经有一个code,但是我需要从服务器上查找name属性。我得到两个数组:一个包含名称,另一个包含代码。对这些数组进行排序,以便nameArray中某个索引处的name与codeArray相同索引处的code完全对应 我一直在遍历Place对象数组,然后检查该Place的code属性是否与code数组中的当前索引相同。如果是,我使用名称数组中的相同索引设置该位置的名称: for(

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

我一直在遍历
Place
对象数组,然后检查该
Place
code
属性是否与
code数组中的当前索引相同。如果是,我使用
名称数组中的相同索引设置该
位置的
名称

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]];
       }
    }
}
for(int i=0;i<[placesArray count];i++)
{
对于(int j=0;j<[codeArray count];j++){
如果([[[placesArray objectAtIndex:i]code]isEqualToString:[codeArray objectAtIndex:j]]){
[[placesArray objectAtIndex:i]setName:[nameArray objectAtIndex:j]];
}
}
}
这可以工作,但速度不是很快——在1000多个位置上循环可能需要30秒


有没有更快的方法?

可以用于NSArray-containsObject

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

与任何时候尝试优化性能一样,您应该使用工具分析代码,以找出瓶颈实际所在。也就是说,在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];
}
NSMutableDictionary*placesByCode=[NSMutableDictionary dictionary with capacity:[placesArray count]];
用于(地点*地点中的一个地点){
[dictionary setObject:aPlace-forKey:aPlace.code];
}
NSMutableDictionary*namesByCode=[NSMutableDictionary Dictionary WithCapacity:[namesArray count]];

对于(inti=0;i尝试在内部循环中使用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;
       }
    }
}
for(int i=0;i<[placesArray count];i++)
{
对于(int j=0;j<[codeArray count];j++){
如果([[[placesArray objectAtIndex:i]code]isEqualToString:[codeArray objectAtIndex:j]]){
[[placesArray objectAtIndex:i]setName:[nameArray objectAtIndex:j]];
打破
}
}
}
当你找到更多的结果时,你也可以使第二个数组变小。这将花费你更多的内存,但是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;
       }
    }
}
NSMutableArray*tempCodeArray=[NSMutableArray数组WithArray:codeArray];
对于(int i=0;i<[placesArray count];i++)
{
对于(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];
打破
}
}
}

问题不在于数组的计数,而在于嵌入的for循环需要O(n*n),在Andrew的解决方案中,只需要O(n)+O(n)+O(n)+O(n)+在字典中查找键的对象,我猜这将在哈希表查找中,速度非常快

Colby,你可能会同意Andrew的解决方案。如果你仍然想提高性能,那么最好先对数组排序,然后再进行查找


希望这能有所帮助。

我已经分析了这一点,并看到
isEqualToString:
被调用了很多。我尝试了你的解决方案,发现性能提高了约96%。你让Andrew大吃一惊。我修改了我的代码,使用
containsObject:
并看到性能提高了约60%。不过,自从Andrew的解决方案w~96%增加。