0

誰もが次へのより速いアプローチを提案できますか:

5,000 個のマネージド オブジェクト (障害) の配列があります (car.h オブジェクトの配列)

各オブジェクトには一連の項目があります (toCarParts.h)。このセットには、任意の数のオブジェクトを含めることができます。

ここで、検索クエリの carpart 配列で最も一致するものでこれらを並べ替えたいと思います。

ホイール、シート、ウィンドウ、ミラーを検索します。

このメソッドは、各車を調べて最も近い一致を見つけ、パーセンテージを計算します。したがって、車 a にホイール、シート、ウィンドウ、ミラー、マット、タイヤ、ワイパー、パイプがある場合、% は 50% になります。(4/8のパーツを合わせました。

これは非常に簡単ですが、問題は 5,000 アイテムの検索に時間がかかることです (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];

}

4

1 に答える 1

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; 

これにより、すべての車のパーセンテージが平均化されます。集合体でパーツを異なる方法で重み付けする方法は他にもあります。

あなたの質問からは明らかではありませんが、合計パーセンテージが必要ではなく、車ごとに 1 つのパーセンテージが必要な場合は、すべての車をループする必要はありません。表示するときにその場でパーセンテージを計算できます (たとえば、過渡特性)。

于 2013-01-16T13:09:53.557 に答える