用valueForKeyPath查找NSMutableArray的平均值

目前我试图find一个紧凑的方式来平均matrix 。 显而易见的解决办法是对matrix求和,然后除以元素数量。 不过,我在苹果开发者网站上遇到了一个方法,声称这可以通过使用valueForKeyPath的简单方法来完成。 这是链接在这里:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html

下面是我正在努力尝试使其运行的示例:

-(void)arrayAverager { NSMutableArray *myArray = [NSMutableArray arrayWithCapacity:25]; [myArray addObject:[NSNumber numberWithInteger:myValue]]; NSNumber *averageValue = [myArray valueForKeyPath:@"@avg.self"]; NSLog(@"avg = %@", averageValue); } 

问题是:而不是平均数组它只打印出数组1中的元素1。

UPDATE

 -(void) pixelAverager { //Put x-coordinate value of all wanted pixels into an array NSMutableArray *xCoordinateArray = [NSMutableArray arrayWithCapacity:25]; [xCoordinateArray addObject:[NSNumber numberWithInteger:xCoordinate]]; NSLog(@"avg = %@", [xCoordinateArray valueForKeyPath:@"@avg.intValue"]); } 

你需要使用@avg.floatValue (或者@avg.doubleValue ,或者你有什么)。 @avg操作符将平均点后面的名称指定的数组中的对象的属性。 文档在这一点上是令人困惑的,但那是什么:

获取由键path指定的属性指定的值到运算符的右侧

在说。 既然你有一个NSNumber对象的集合,你可以使用一个*value访问器,例如floatValue来获取每个对象的值。 举个例子:

 #include <Foundation/Foundation.h> int main(void) { NSMutableArray *ma = [NSMutableArray array]; [ma addObject:[NSNumber numberWithFloat:1.0]]; [ma addObject:[NSNumber numberWithFloat:2.0]]; [ma addObject:[NSNumber numberWithFloat:3.0]]; NSLog(@"avg = %@", [ma valueForKeyPath:@"@avg.floatValue"]); return 0; } 

编译并运行这个代码将返回:

 $ clang avg.m -framework Foundation -o avg steve:~/code/tmp $ ./avg 2013-01-18 12:33:15.500 avg[32190:707] avg = 2 steve:~/code/tmp 

这种方法的@avg ,只要所有对象都响应指定的方法,这个工作对于任何集合都是同质的,否则@avg将起作用。

编辑

正如评论中所指出的那样,OP的问题是他正在用一个元素对一个集合进行平均,因此它似乎只是打印集合的内容。 对于NSNumber对象的集合, @avg.self工作得很好。

不,你不能这样做。 对象Transaction是一个Modal Class 。 这个class有三个属性,即

  • 收款人
  • date

这个图像中的每一row代表一个Transaction modal object

在这里输入图像说明

transactions是一个array所有这些行的arrayTransaction Modal Objects )。

在这些transactions数组中,他们正在尝试使用运算符@avg来计算Transaction Modal 金额字段平均值。 所以,它的样子

 NSNumber *transactionAverage = [transactions valueForKeyPath:@"@avg.amount"]; 

你的数组没有关键的self 。 所以这就是问题所在

Interesting Posts