2013-08-05 241 views
0

我需要在我的應用程序中添加一些內容來計算數字數組的平均值。計算數組中的平均值

如果我有3個數字:10,20和30,我如何獲取數組中的所有數字,將它們加在一起(60),然後除以總數,並將最終數字作爲標籤呈現?

+0

我真的不知道該怎麼要做到這一點...但最新數組從可變數組的問題? –

+0

使用可變數組中的數字沒有任何問題。實際上,**是** @Rob所指的支持你的收藏視圖的模型的一種形式。話雖如此,你應該按照他的要求描述存儲在數組中的數據。 (他們是NSNumber的嗎?) – lnafziger

回答

18

除了手動計算平均katzenhut的建議,您可以使用KVC收集運營商也是如此,如:

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

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

或者,如果有對象處理,例如「產品」模型對象這個接口:

@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的好處是,你有過的字符串表示更大的控制權數字,例如它可以觀察本地化,使用千分之一分隔符等。

+0

@skram - 您編輯了這個答案,用'@(42)'替換'@ 42',將後者描述爲「正確的語法」。括號是不必要的,並且對此答案不加任何附加。請參閱http://clang.llvm.org/docs/ObjectiveCLiterals.html。 – Rob

3

you shuold有一個包含單元格值的數組,每當編輯單元格時都應該更新該數組。因此,將這些值加起來以備後用(例如,在名爲total的浮點型中)。

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

按總數除數,就完成了。像float average = total/myArray.count

+0

順便說一句,浮動的不能被存儲在一個NSArray .... – lnafziger

+0

它給了我一個錯誤,我不能把浮動的東西 –

+0

作爲@lnafziger指出,你需要在處理集合類時使用對象。我改變了這個例子。 – katzenhut

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馬克 - 表視圖的數據源

- (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]); 
}