计算数组中的平均值

时间:2013-08-05 19:45:49

标签: ios objective-c nsarray

我需要在我的应用中添加一些能够计算数字数组平均值的内容。

如果我有3个数字:10,20和30,我如何获取数组中的所有数字,将它们加在一起(60)然后除以总数并在标签的某处显示最终数字?

3 个答案:

答案 0 :(得分:18)

除了katzenhut建议手动计算平均值之外,你也可以使用KVC收集算子,例如:

NSArray *array = @[@10, @25, @30];

NSNumber *average = [array valueForKeyPath:@"@avg.self"];

或者,如果处理对象,例如具有此接口的“Product”模型对象:

@interface Product : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic) double price;

- (id)initWithName:(NSString *)name price:(double)price; // the corresponding implementation should be obvious, so I'll not include it in this code snippet

@end

然后你可以这样做:

NSMutableArray *products = [NSMutableArray array];
[products addObject:[[Product alloc] initWithName:@"item A" price:1010.0]];
[products addObject:[[Product alloc] initWithName:@"item B" price:1025.0]];
[products addObject:[[Product alloc] initWithName:@"item C" price:1030.0]];

NSNumber *average = [products valueForKeyPath:@"@avg.price"];

如果您想获取结果并使用结果填充标签,您可能会执行以下操作:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
formatter.maximumFractionDigits = 2;                   // two decimal places?

self.averageLabel.text = [formatter stringFromNumber:average];

NSNumberFormatter优于stringWithFormat的优势在于您可以更好地控制数字的字符串表示形式,例如它可以观察定位,使用千分之一的分隔符等。

答案 1 :(得分:3)

你shuold有一个包含你的单元格值的数组,你应该在编辑单元格时更新该数组。因此,请将这些值添加到以后使用(例如,在名为total的浮点数中)。

float total;
total = 0;
for(NSNumber *value in myArray){
    total+=[value floatValue];
}

按总数除以总数,然后就完成了。比如float average = total/myArray.count

答案 2 :(得分:0)

您应该拥有合适的数据模型。例如,如果您有30个单元格,则无需在tableview中显示所有30个单元格。这样做会浪费资源,这就是为什么我们总是在tableview委托中实现dequereuseable方法。

话虽如此,做这样的事情

#import <UIKit/UIKit.h>

@interface ViewController : UITableViewController

@end

实施如下

 #import "ViewController.h"

@interface ViewController ()
{
    NSArray *numbersList;
}

-(float) calculateAvg;

@end

@implementation ViewController

- (id)initWithStyle:(UITableViewStyle)style
   {
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    numbersList = [[NSArray alloc]initWithObjects:@"10",@"23",@"34",@"43",@"57",@"64",@"77",@"88",@"95",nil];
    [[self tableView] setDelegate:self];
    [[self tableView] setDataSource:self];
}

#pragma mark - 表视图数据源

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section. Plus one to hold average
    return [numbersList count] + 1;
}

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if(cell == nil)
    {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    if([indexPath row] < [numbersList count])
    {
        [[cell textLabel] setText:[numbersList objectAtIndex:[indexPath row]]];
    }
    else
    {
        float avg = [self calculateAvg];
        [[cell textLabel] setText:[NSString stringWithFormat:@"%f",avg]];
    }


    return cell;

}

-(float) calculateAvg
{
    float avg = 0;

    for(int idx=0;idx<[numbersList count];idx++)
    {
        int tempValue = [[numbersList objectAtIndex:idx] intValue];
        avg = avg + tempValue;
    }

    return (avg / [numbersList count]);
}