Ios 计算xcode中1000个慢速对象的百分比

Ios 计算xcode中1000个慢速对象的百分比,ios,core-data,Ios,Core Data,有谁能提出一种更快的方法来解决以下问题: 我有一个5000个托管对象的数组(有故障)(一个car.h对象数组) 每个对象都有一组项(toCarParts.h)。此集合可以有任意数量的对象 现在,我想通过搜索查询carpart数组中的大多数匹配项来对它们进行排序 我寻找轮子、座位、窗户、镜子 该方法将遍历每辆车,找到最接近的匹配项,并计算一个百分比。因此,如果汽车有车轮、座椅、车窗、后视镜、垫子、轮胎、雨刮器、管道-->则百分比应为50%。(匹配4/8个零件 这很简单,但问题是搜索5000个项目需

有谁能提出一种更快的方法来解决以下问题:

我有一个5000个托管对象的数组(有故障)(一个car.h对象数组)

每个对象都有一组项(toCarParts.h)。此集合可以有任意数量的对象

现在,我想通过搜索查询carpart数组中的大多数匹配项来对它们进行排序

我寻找轮子、座位、窗户、镜子

该方法将遍历每辆车,找到最接近的匹配项,并计算一个百分比。因此,如果汽车有车轮、座椅、车窗、后视镜、垫子、轮胎、雨刮器、管道-->则百分比应为50%。(匹配4/8个零件

这很简单,但问题是搜索5000个项目需要很长时间(即使使用coredata)

我使用的逻辑类似:(伪代码)

必须有一个更好的方法,有什么建议吗?(我认为这是划分和检查每个部分的过程,需要花费很长时间

先谢谢你

已编辑,在下面添加了代码:

-(NSMutableArray*)计算百分比Perfind:(NSMutableArray*)CarArray:(NSMutableArray*)partsArray{ NSArray*defaultParts=[NSArray arrayWithArray:[[HelperMethods alloc]init]getObjectUserDefault:@“AvailableDefaultParts”]

int lowestPercentMatchInt=[[HelperMethods alloc]init]getIntegerUserDefault:@“lowestPercentageMatch”];
NSMutableArray*partsFromCarArray=[[NSMutableArray alloc]init];
NSMutableArray*returnArray=[[NSMutableArray alloc]init];
NSMUTABLEARRY*partsWithDefaultParts=[NSMUTABLEARRY ARRAY WITHARRAY:partsArray];
[partsWithDefaultParts添加对象数组:defaultParts];
对于(整数i=0;百分比匹配整数){
partsFromCarArray=[NSMutableArray数组WithArray:[[CarResult toParts]AllObject]];
NSMutableArray*faultedParts=[[NSMutableArray alloc]init];
对于(整数i=0;百分比匹配整数){
如果(百分比匹配>100){
CarResult.percentMatch=[NSNumber numberWithDouble:100.00];
}否则{
CarResult.percentMatch=[NSNumber numberWithDouble:percentMatch];
}
[returnArray addObject:CarResult];
}
}
}
NSLog(@“匹配的车辆百分比=%i”,[returnArray count]);
return[self arrangeByHighestPercentMatch:returnArray];

}

试试这个,我相信这会减少核心数据的压力

NSSet *selectionSet; // contains the selected parts
NSPredicate *filter = [NSPredicate predicateWithFormat:
                          @"self IN %@", selectionSet];
float percentageSum = 0;
NSSet *parts;
for (Car *car in fetchedObjects) {
   parts = car.parts;  // so the relationship is retrieved only once
   percentageSum += 
       [parts filteredSetUsingPredicate:predicate].count*1.0f 
                                          / (parts.count*1.0f);
}
return percentageSum/fetchedObjects.count; 
这将平均出所有汽车的百分比。还有其他方法在总量中对零件进行不同的称重


您的问题并不清楚,但如果您不需要总百分比,而是每辆车需要一个百分比,那么就不需要在所有车中循环-您可以在显示时动态计算百分比(例如,使用瞬态属性)。

这听起来是一个完美的()也许你会考虑把它张贴在那里,但你需要提供代码以获得帮助(你也应该在这里做,BTW),谢谢你的页面,你寻找一个百分比为每辆车(要显示,例如,在表视图),或为总百分比的“使用”。,在5000辆车的池中,任意选择一组零件?每辆车一个百分比(在tableview中)确实非常慢,您能给我们显示数据结构而不是评级代码吗?因为数据结构可以提供更多信息,说明哪种类型的搜索算法是更好的选择…您好,这一行[parts filteredSetUsingPredicate:predicate].count/parts.count;给我0(即使我知道有匹配项),有什么想法吗?是的,我忘了让它们浮起来。整数除法将得到0。请参见上面的更正。刚才看到了你对我上面评论的回答。好的,你需要的公式在循环中,但你不需要循环。NSLog会使它慢很多。你可以使用时间戳进行检查。请告诉我你的工作谓词,以便我可以更新答案。我必须通过猜测来推断数据模型的情况…啊,好吧-你有一个名称数组,而不是对象数组。我认为这比使用实际对象还要慢。
int lowestPercentMatchInt=[[[HelperMethods alloc]init]getIntegerUserDefault:@"lowestPercentageMatch"];

NSMutableArray*partsFromCarArray=[[NSMutableArray alloc]init];

NSMutableArray*returnArray=[[NSMutableArray alloc]init];

NSMutableArray *partsWithDefaultParts =[NSMutableArray arrayWithArray:partsArray];
[partsWithDefaultParts addObjectsFromArray:defaultParts];


for (int i=0; i<[CarArray count]; i++) {
    double matchCount=0;
    Car *CarResult =(Car*)[CarArray objectAtIndex:i];

            //Check if it will at least be 30% match
    double number1 = [partsWithDefaultParts count];
        number1 =(number1/[CarResult.numberOfParts doubleValue])*100;
        if (number1>lowestPercentMatchInt) {
            partsFromCarArray =[NSMutableArray arrayWithArray:[[CarResult toParts]allObjects]];
            NSMutableArray *faultedParts=[[NSMutableArray alloc]init];
            for (int i =0; i<[partsFromCarArray count]; i++) {
                CarPart*part = (CarPart*)[partsFromCarArray objectAtIndex:i];
                    [faultedParts addObject:part.name];
            }
        // for each part in the Car
        for (NSString *partInCar in partsWithDefaultParts){
            //if the search parts contain that part, add one to count
            if ([faultedParts containsObject:partInCar]) {
                matchCount++;
            }
        }
        //Calculate percent match
        double percentMatch = matchCount;

        percentMatch =(percentMatch/[CarResult.numberOfParts doubleValue])*100;

        //if at least 30%(user default) then add the percent match to Car result
        if (percentMatch >lowestPercentMatchInt) {
            if (percentMatch>100) {
                CarResult.percentMatch = [NSNumber numberWithDouble:100.00];
            }else{
                CarResult.percentMatch = [NSNumber numberWithDouble:percentMatch];
            }
            [returnArray addObject:CarResult];
        }
}
}
NSLog(@"Percent Matched Cars = %i",[returnArray count]);
return [self arrangeByHighestPercentMatch:returnArray];
NSSet *selectionSet; // contains the selected parts
NSPredicate *filter = [NSPredicate predicateWithFormat:
                          @"self IN %@", selectionSet];
float percentageSum = 0;
NSSet *parts;
for (Car *car in fetchedObjects) {
   parts = car.parts;  // so the relationship is retrieved only once
   percentageSum += 
       [parts filteredSetUsingPredicate:predicate].count*1.0f 
                                          / (parts.count*1.0f);
}
return percentageSum/fetchedObjects.count;