OBJ-C: получение минимального/максимального значения в NSMutableArray
Я хочу получить максимальное и минимальное значения NSMutableArray, чтобы я мог создать графическое пространство ядра и график, основанный на этих значениях max и min.
Мой код выглядит следующим образом:
NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100];
NSUInteger i;
for (i=0; i<60; i++){
id x = [NSNumber numberWithFloat:i*0.05];
id y = [NSNumber numberWithFloat:1.2*rand()/(float)RAND_Max + 0.6];
[contentArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:x, @"x", y, @"y", nil]];
}
self.dataForPlot = contentArray;
CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat() length:CPDecimalFromFloat()];
plotSpace.yRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat() length:CPDecimalFromFloat()];
Что я могу заполнить пробелы для назначения xRange и yRange, если я хочу, чтобы график охватывал только пространство того, что указано в contentArray?
Ответы
Ответ 1
В этом случае вы должны использовать -[CPPlotSpace scaleToFitPlots:]
. Для более общих вычислений значений массива читайте далее...
Это идеальное использование для кодирования Key-Value и связанных операторов . В вашем примере
float maxX = [[contentArray valueForKeyPath:@"@max.x"] floatValue];
float minY = [[contentArray valueForKeyPath:@"@min.x"] floatValue];
float maxY = [[contentArray valueForKeyPath:@"@max.y"] floatValue];
float minY = [[contentArray valueForKeyPath:@"@min.y"] floatValue];
Операторы массива вызывают valueForKeyPath:
на contentArray
, который дает массив, построенный путем вызова того же valueForKeyPath:
для каждого члена массива с помощью пути ключа справа от оператора массива (т.е. @min
и @max
). Затем вызов orignal применяет данный оператор к результирующему массиву. Вы можете легко определить категорию на NSArray
, чтобы вернуть вам структуру значений min/max:
typedef struct {
float minX;
float minY;
float maxX;
float maxY;
} ArrayValueSpace;
@implementation NSArray (PlotSpaceAdditions)
- (ArrayValueSpace)psa_arrayValueSpace {
ArrayValueSpace result;
result.maxX = [[contentArray valueForKeyPath:@"@max.x"] floatValue];
result.minX = [[contentArray valueForKeyPath:@"@min.x"] floatValue];
result.maxY = [[contentArray valueForKeyPath:@"@max.y"] floatValue];
result.minY = [[contentArray valueForKeyPath:@"@min.y"] floatValue];
return result;
}
Ответ 2
Вы можете найти значения max и min при его заполнении, но это будет работать только при использовании в вашем фрагменте. Если вам требуется нечто более общее, вам нужно просто просмотреть список и найти его.
// contentArray already defined
int maxX = 0, minX = 1000, maxY = 0, minY = 1000;
for (int i = 0; i < [contentArray count]; ++1)
{
int curX = [[[contentArray objectForKey:@"x"] objectAtIndex:i] integerValue];
int curY = [[[contentArray objectForKey:@"y"] objectAtIndex:i] integerValue];
if (curX < minX)
minX = curX;
else if (curX > maxX)
maxX = curX;
if (curY < minY)
minY = curY;
else if (curY > maxY)
maxY = curY;
}
Ответ 3
Вы можете использовать быстрое перечисление через массив.
.
NSUInteger maxX = 0;
NSUInteger minX = 0xFFFFFFFF; //(for 32 bit)
NSUInteger maxY = 0;
NSUInteger minY = 0xFFFFFFFF; //(for 32 bit)
for ( NSDictionary *dict in contentArray )
{
NSUInteger newX = [[dict objectForKey:@"x"] integerValue];
NSUInteger newY = [[dict objectForKey:@"y"] integerValue];
if (maxX > newX) maxX = newX;
if (minX > newX) minX = newX;
if (maxY > newY) maxY = newY;
if (minY > newY) minX = newY;
}
Ответ 4
если у вас есть NSMutableArray объектов NSDictionary, вы можете использовать это:
-(float)findMax:array arrayKey:obj {
float max = [[[array objectAtIndex:0] objectForKey:obj] floatValue];
for ( NSDictionary *dict in array ) {
if(max<[[dict objectForKey:obj] floatValue])max=[[dict objectForKey:obj] floatValue];
}
return max;
}
-(float)findMin:array arrayKey:obj {
float min = [[[array objectAtIndex:0] objectForKey:obj] floatValue];
for ( NSDictionary *dict in array ) {
if (min > [[dict objectForKey:obj] floatValue])min = [[dict objectForKey:obj] floatValue];
}
return min;
}
Вы получили бы доступ к таким методам, если в другом классе:
GraphData *c=[[GraphData alloc] init];
float maxY=[c findMax:plotData arrayKey:[NSNumber numberWithInt:1]]; //1 or 0 depending on axis
[c release];