Как найти среднее значение NSNumbers в NSArray? - PullRequest
13 голосов
/ 15 июля 2010

Я пытаюсь вычислить медиану (небольшого) набора NSNumbers в NSArray. Каждый объект в NSArray является NSNumber.

Вот что я пытаюсь, но не работает:

NSNumber *median = [smallNSArray valueForKeyPath:@"@median.floatValue"];

Ответы [ 3 ]

23 голосов
/ 15 июля 2010
NSArray *sorted = [smallNSArray sortedArrayUsingSelector:@selector(compare:)];    // Sort the array by value
NSUInteger middle = [sorted count] / 2;                                           // Find the index of the middle element
NSNumber *median = [sorted objectAtIndex:middle];                                   // Get the middle element

Вы можете полюбить. Например, медиана набора с четным числом чисел технически является средним из средних двух чисел. Вы также можете заключить это в аккуратный однострочный метод в категории на NSArray:

@interface NSArray (Statistics)
- (id)median;
@end

@implementation NSArray (Statistics)

- (id)median
{
    return [[self sortedArrayUsingSelector:@selector(compare:)] objectAtIndex:[self count] / 2];
}

@end
6 голосов
/ 24 марта 2014

Для тех, кому необычно нужна эта функция, есть метод категории в NSArray, который будет работать как с нечетным, так и с четным числом элементов:

МЕТОД КАТЕГОРИИ NSARRAY

- (float)median {
    if (self.count == 1) return [self[0] floatValue];

    float result = 0;
    NSUInteger middle;

    NSArray * sorted = [self sortedArrayUsingSelector:@selector(compare:)];
    if (self.count % 2 != 0) {  //odd number of members
        middle = (sorted.count / 2);
        result = [[sorted objectAtIndex:middle] floatValue];
    }
    else {
        middle = (sorted.count / 2) - 1;
        result = [[@[[sorted objectAtIndex:middle], [sorted objectAtIndex:middle + 1]] valueForKeyPath:@"@avg.self"] floatValue];
    }
    return result;
}

ТЕСТ

NSArray * singleElement = @[@1];
NSArray * oddNumberOfElements = @[@3, @5, @7, @12, @13, @14, @19, @20, @21, @22, @23, @29, @39, @40, @56];
NSArray * evenNumberOfElements = @[@3, @5, @7, @12, @13, @14, @19, @20, @21, @22, @23, @29, @40, @56];

NSLog(
    @"oddNumberOfElements: %f, evenNumberOfElements: %f singleElement: %f",
    [oddNumberOfElements median], [evenNumberOfElements median], [singleElement median]
);
//oddNumberOfElements: 20.000000, evenNumberOfElements: 19.500000 singleElement: 1.000000
3 голосов
/ 28 июля 2015

Удлинитель Swift

extension Array where Element: Comparable {

  var median: Element {
    return self.sort(<)[self.count / 2]
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...