在xcode中计算1000个对象的百分比

时间:2013-01-16 02:28:15

标签: ios core-data

任何人都可以建议更快地采取以下措施:

我有一个包含5,000个托管对象的数组(出错)(car.h对象数组)

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

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

我搜索轮子,座位,窗户,镜子。

该方法将遍历每辆车并找到最接近的匹配,并计算百分比。因此,如果汽车a有车轮,座椅,车窗,镜子,垫子,轮胎,雨刮器,管子 - > %应该是50%。 (匹配4/8部分。

这很简单,但问题是5000项搜索需要很长时间(甚至使用coredata)。

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

 For each Car*car in array.
   NSMutableArray *x=[car tocarparts]allobjects];
   For the count of objects in x.
     Carpart*part=objectatindex...i.
     If the name of this matches one of my parts 
       add a count to my counter.
   At the end of the loop counter/[x count] =%.car.percent=%.

必须有更好的方法,任何建议? (我认为它是划分和检查永远需要的每个部分。

提前谢谢。

编辑,添加以下代码:。

- (NSMutableArray的*)calculatePercentagePerFind:(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];

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];

}

1 个答案:

答案 0 :(得分:1)

试试这个,我认为这将最大限度地减少核心数据的压力。

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; 

这将平均所有汽车的百分比。还有其他方法可以在总体上对部件进行不同的称重。

从您的问题中不清楚,但如果您不需要总百分比但每辆车只需一个百分比就没有必要循环所有车辆 - 您可以在显示时动态计算百分比(例如,具有瞬态特性)。