OBJ-C:获取NSMutableArray中的最小/最大值

Kev*_*vin 10 iphone plot objective-c core-plot

我想得到一个NSMutableArray的最大值和最小值,这样我就可以根据这些最大值和最小值创建一个核心图绘图空间和图形.

我的代码如下:

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()];
Run Code Online (Sandbox Code Playgroud)

如果我希望图形只跨越contentArray中指定的空间,我应该填写xRange和yRange赋值的空白?

Bar*_*ark 21

在这种情况下,你应该使用-[CPPlotSpace scaleToFitPlots:].有关数组值的更一般计算,请继续阅读......

这是键值编码和相关阵列运算符的理想用途.在你的例子中,

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];
Run Code Online (Sandbox Code Playgroud)

阵列运营商调用valueForKeyPath:contentArray其给出通过调用相同的内置的阵列valueForKeyPath:与该键路径阵列到阵列操作者(即,右侧的每个成员上@min@max).然后,orignal调用将给定的运算符应用于结果数组.您可以轻松定义一个类别,NSArray以返回最小/最大值的结构:

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;
}
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 1

当您填充它时,您可以找到最大值和最小值,但它仅在您的代码片段中使用时才起作用。如果您想要更通用的东西,您应该简单地浏览列表并搜索它。

// 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;
}
Run Code Online (Sandbox Code Playgroud)