OBJ-C: Ottenere il / valore massimo minimo in un NSMutableArray
-
23-09-2019 - |
Domanda
Voglio ottenere il valori massimo e minimo di un NSMutableArray in modo da poter creare un plotspace core-trama e grafico basato intorno quei valori MAX e MIN.
Il mio codice è il seguente:
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()];
Di cosa ho riempire gli spazi vuoti per xrange e YRange assegnazione se voglio il grafico si estendono solo lo spazio di ciò che è specificato nel contentArray?
Nessuna soluzione corretta
Altri suggerimenti
In questo caso, è necessario utilizzare -[CPPlotSpace scaleToFitPlots:]
. Per i calcoli più generale sui valori di matrice, continuate a leggere ...
Questo è un uso ideale per la codifica di valori-chiave e associato operatori di matrice . Nel tuo esempio,
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];
Gli operatori di matrice chiamano valueForKeyPath:
sul contentArray
che dà una matrice costruita chiamando stesso valueForKeyPath:
in ogni membro della matrice con il percorso della chiave a destra dell'operatore matrice (cioè @min
e @max
). La chiamata orignal applica quindi l'operatore dato alla matrice risultante. Si potrebbe facilmente definire una categoria sulla NSArray
di restituirvi una struttura di valori / max min:
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;
}
È possibile trovare i valori minimo massimo e quando si riempie, ma avrebbe funzionato solo quando viene utilizzato nel vostro snippet. Se volete qualcosa di più generico si dovrebbe semplicemente passare attraverso la lista e la ricerca di esso.
// 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;
}
Si potrebbe utilizzare l'enumerazione veloce attraverso l'array. .
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;
}
se avete NSMutableArray di NSDictionary oggetti è possibile utilizzare questo:
-(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;
}
Si potrebbe accedere a metodi come questo se in un'altra classe:
GraphData *c=[[GraphData alloc] init];
float maxY=[c findMax:plotData arrayKey:[NSNumber numberWithInt:1]]; //1 or 0 depending on axis
[c release];
// Questo dà Max e Min Valore in NSMutableArrray - (void) {FindingMinAndMaxValueInNSMutableArray
NSMutableArray *array=[[NSMutableArray alloc]initWithObjects:@"0.987",@"0.951",@"0.881",@"0.784",@"0.662",@"0.522",@"0.381",@"-0.265",@"-0.197", @"0.189",@"-0.233",@"0.310",@"0.402",@"0.402",@"0.988",@"0.633",@"0.661",@"0.656",@"0.617",@"0.634",@"0.690",@"0.767",@"0.836",nil];
NSLog(@"The Array Value is %@",array);
NSLog(@"The Array Count is %lu",(unsigned long)array.count);
NSNumber *maxValue = [array valueForKeyPath:@"@max.doubleValue"];
NSLog(@"The maxValue is %@",maxValue);
NSString *str=[NSString stringWithFormat:@"%@",maxValue];
NSInteger path=[array indexOfObject:str];
NSIndexPath *indexpath=[NSIndexPath indexPathForItem:path inSection:0];
NSLog(@"Max Value = %@ and index = %ld",maxValue,(long)indexpath.row);
NSNumber *minValue = [array valueForKeyPath:@"@min.doubleValue"];
NSLog(@"The minValue is %@",minValue);
NSString *str1 = [NSString stringWithFormat:@"%@",minValue];
NSInteger path1 = [array indexOfObject:str1];
NSIndexPath *indexPath1 = [NSIndexPath indexPathForItem:path1 inSection:0];
NSLog(@"Min Value =%@ and index = %ld",minValue,(long)indexPath1.row);
}