我需要在我的应用中添加一些能够计算数字数组平均值的内容。
如果我有3个数字:10,20和30,我如何获取数组中的所有数字,将它们加在一起(60)然后除以总数并在标签的某处显示最终数字?
答案 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]);
}