用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
所有这些行的array
( Transaction Modal Objects
)。
在这些transactions
数组中,他们正在尝试使用运算符@avg
来计算Transaction Modal
金额字段平均值。 所以,它的样子
NSNumber *transactionAverage = [transactions valueForKeyPath:@"@avg.amount"];
你的数组没有关键的self
。 所以这就是问题所在