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%增加。