数値の配列の平均を計算する何かをアプリに追加する必要があります。
10、20、30 の 3 つの数字がある場合、配列内のすべての数字を取得し、それらを合計して (60)、合計数で割り、最終的な数字をラベルのような場所に表示するにはどうすればよいですか?
数値の配列の平均を計算する何かをアプリに追加する必要があります。
10、20、30 の 3 つの数字がある場合、配列内のすべての数字を取得し、それらを合計して (60)、合計数で割り、最終的な数字をラベルのような場所に表示するにはどうすればよいですか?
平均を手動で計算するという 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
overの利点はstringWithFormat
、数値の文字列表現をより詳細に制御できることです。たとえば、ローカリゼーションを観察したり、3 分の 1 区切り記号を使用したりできます。
セルの値を含む配列が必要であり、セルが編集されるたびにその配列を更新する必要があります。したがって、後で使用するためにこれらの値を追加します (たとえば、 という名前の float でtotal
)。
float total;
total = 0;
for(NSNumber *value in myArray){
total+=[value floatValue];
}
合計をカウントで割れば、完了です。お気に入りfloat average = total/myArray.count
適切なデータ モデルが必要です。たとえば、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 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]);
}