2013-08-05 7 views
0

Мне нужно добавить что-то в свое приложение, которое вычисляет среднее значение массива чисел.Вычислить среднее значение в массиве

Если у меня есть 3 числа: 10, 20 и 30, как мне взять все числа в массиве, добавьте их вместе (60), а затем разделите их на общее число и представите конечное число где-нибудь как метка ?

+0

Я не знаю, как для этого ... но в чем проблема с числами из изменяемого массива? –

+0

Нет ничего плохого в использовании чисел из изменяемого массива. Фактически, это ** - это форма модели, поддерживающая ваше представление о сортировке, которое имеет в виду @Rob. При этом вам следует описать данные, которые хранятся в массиве по его просьбе. (Являются ли они NSNumber?) – lnafziger

ответ

18

В дополнение к предложению katzenhut о вручную расчета среднего, вы можете использовать операторы сбора КВЦ, тоже, например:

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

у вас shuold есть массив, который содержит значения для ваших ячеек, и вы должны обновлять этот массив всякий раз, когда редактируется ячейка. Поэтому добавьте эти значения для последующего использования (скажем, в float с именем total).

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

Разделите итоговое количество, и все готово. как float average = total/myArray.count

+0

Кстати, float не может быть сохранен в NSArray .... – lnafziger

+0

это дает мне ошибку, что я не могу поместить float в a или что-то –

+0

, поскольку @lnafziger указал, вам нужно для работы с объектами при работе с классами коллекции. Я изменил пример, чтобы учесть это. – katzenhut

0

У вас должна быть правильная модель данных. Например, если у вас есть 30 ячеек, нет необходимости отображать все 30 ячеек в вашем представлении таблицы. Это будет пустой тратой ресурсов и что мы всегда применяем метод dequereuseable в делегатах tableview.

Сказав, что сделать что-то вроде этого

#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]); 
} 
Смежные вопросы