Find the average of an NSMutableArray with valueForKeyPath

后端 未结 2 2084
清酒与你
清酒与你 2021-01-13 09:47

Currently I\'m trying to find a compact way to average a matrix. The obvious solution is to sum the matrix, then divide by the number of elements. I have, h

2条回答
  •  甜味超标
    2021-01-13 10:13

    You need to use @avg.floatValue (or @avg.doubleValue, or what have you). The @avg operator will average the property of the objects in the array specified by the name after the dot. The documentation is confusing on this point, but that is what:

    to get the values specified by the property specified by the key path to the right of the operator

    Is saying. Since you have a collection of NSNumber objects, you use one of the *value accessors, e.g. floatValue to get the value of each object. As an example:

    #include 
    
    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;
    }
    

    Compiling and running this code returns:

    $ 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
    

    The nice thing about this approach is that this work for any collection, homogenous or otherwise, as long as all objects respond to the specified method, @avg will work.

    EDIT

    As pointed in the comments, the OP's problem is that he is averaging a collection with one element, and thus it appears to simply print the contents of the collection. For a collection of NSNumber objects, @avg.self works just fine.

提交回复
热议问题