0

ダブルオブジェクトのNSArrayがあります。現在、NSArrayを通過して平均化するためのforループがあります。NSArrayの最小値と最大値を決定する方法を探していますが、どこから始めればよいのかわかりません...以下は、平均を取得するために必要な現在のコードです。

NSArray *TheArray = [[NSArray alloc] initWithArray:self.fetchedResultsController.fetchedObjects];
    int TotalVisitors = [TheArray count];
    double aveRatingSacore = 0;

for (int i = 0; i < TotalVisitors; i++)
        {
            Visitor *object = [TheArray objectAtIndex:i];
            double two = [object.rating doubleValue];
            aveRatingSacore = aveRatingSacore + two;
        }

        aveRatingSacore = aveRatingSacore/TotalVisitors;

ヘルプ、提案、コードをいただければ幸いです。

4

3 に答える 3

12

これはどうですか?

NSArray *fetchedObjects = self.fetchedResultsController.fetchedObjects;
double avg = [[fetchedObjects valueForKeyPath: @"@avg.price"] doubleValue];
double min = [[fetchedObjects valueForKeyPath: @"@min.price"] doubleValue];
double max = [[fetchedObjects valueForKeyPath: @"@max.price"] doubleValue];
于 2012-06-24T01:47:53.800 に答える
3
NSArray *TheArray = [[NSArray alloc] initWithArray:self.fetchedResultsController.fetchedObjects];
int TotalVisitors = [TheArray count];
double aveRatingSacore = 0;
double minScore = 0;
double maxScore = 0;

for (int i = 0; i < TotalVisitors; i++)
        { 
            Visitor *object = [TheArray objectAtIndex:i];
            double two = [object.rating doubleValue];
            aveRatingSacore = aveRatingSacore + two;
            if (i == 0) {
                minScore = two;
                maxScore = two;
                continue;
            }
            if (two < minScore) {
                 minScore = two;
            }
            if (two > maxScore) {
                 maxScore = two;
            }
        }

aveRatingSacore = aveRatingSacore/TotalVisitors;
于 2012-06-24T01:12:34.617 に答える
3

2つのダブルを設定します。1つは最小用、もう1つは最大用です。次に、各反復で、それぞれを既存の最小/最大の最小/最大と反復の現在のオブジェクトに設定します。

double theMin;
double theMax;
BOOL firstTime = YES;
for(Visitor *object in TheArray) {
  if(firstTime) {
    theMin = theMax = [object.rating doubleValue];
    firstTime = NO;
    coninue;
  }
  theMin = fmin(theMin, [object.rating doubleValue]);
  theMax = fmax(theMax, [object.rating doubleValue]);
}

firstTimeビットは、ゼロを含む誤検知を回避するためだけのものです。

于 2012-06-24T01:19:34.693 に答える