2010-02-26 25 views
10

içinde en düşük/en büyük değeri alma Bir NSMutableArray öğesinin maksimum ve minimum değerlerini almak istiyorum, böylece bu max ve min değerlerini temel alan bir temel çizim grafiği ve grafiği oluşturabilirim. Ben grafik contentArray belirtilen ne sadece boşluğu doldururlar istiyorsanızOBJ-C: Bir 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()]; 

Ben xrange ve yRange atama için boşlukları ne dolduruyorsunuz şu şekildedir:

Benim kodudur?

cevap

0

Doldurduğunuzda maksimum ve min değerlerini bulabilirsiniz, ancak snippet'inizde kullanıldığında çalışır. Eğer daha genel bir şey istiyorsanız, sadece listeden geçmeli ve arama yapmalısınız.

// 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; 
} 
0

Diziyle hızlı numaralandırmayı kullanabilirsiniz. .

Bu durumda
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; 
} 
+0

Bu hızlıdır baktığı gerçeğini bilmiyorum ama son atama için şunu kullanabilirsiniz: Maxx = MAX (maxX, yeni X); vb ... –

21

, sen -[CPPlotSpace scaleToFitPlots:] kullanmalıdır. Dizi değerleri hakkında daha genel hesaplamalar için şu adresten okuyun ...

Bu, Anahtar Değer kodlaması ve ilişkili array operators için ideal bir kullanımdır. Örnekte,

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]; 

dizi operatörleri dizi operatörünün sağında (yani @min ve anahtar yolu ile dizinin her üyesinde aynı valueForKeyPath: arayarak inşa edilmiş bir dizi veren contentArray üzerinde valueForKeyPath: çağrı @max). Orignal çağrı daha sonra verilen operatörü sonuçlanan diziye uygular.

-(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; 
} 

Sen yöntemlerine erişmek olacaktır: Eğer NSDictionary ait NSMutableArray bunu kullanabilir nesneleri varsa

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; 
} 
+0

Teşekkürler Barry, cevabınız çok yardımcı oldu. Eksenler için otomatik ayarlama özelliği var mı? – Kevin

+0

'CPAxis' sınıfı, otomatik etiketleme politikasını desteklemektedir (' CPAxisLabelingPolicyAutomatic'). Eksen, sanırım, otomatik olarak arsa alanını genişletecektir, böylece sadece etiketleme politikasını otomatik olarak ayarlamanız ve arsa alanının boyutlarını değiştirdiğinde yeniden etiketlemesini söylemeniz gerekir. –

+0

@BarryWark Aynı grafik alanında çizilecek 2 veya daha fazla farklı dizim varsa ne olur? Tüm dizilerin en küçük ve en büyük Y değerini nasıl alabilirim? –

0

: Kolayca min/max değerlerin bir yapı sizi geri vermek NSArray bir kategori tanımlayabiliriz böyle başka bir sınıfta:

GraphData *c=[[GraphData alloc] init]; 
float maxY=[c findMax:plotData arrayKey:[NSNumber numberWithInt:1]]; //1 or 0 depending on axis 
[c release];