2010-02-26 103 views
10

我想獲取NSMutableArray的最大值和最小值,以便我可以創建基於這些最大值和最小值的核心圖圖解空間和圖形。OBJ-C:獲取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()]; 

我填補空白的XRANGE和yRange分配如果我希望圖形僅跨越什麼在contentArray指定的空間?

回答

0

當你填充它時,你可以找到最大值和最小值,但它會在你的代碼片段中使用時發揮作用。如果你想要更通用的東西,你應該簡單地瀏覽列表並搜索它。

// 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

您可以通過數組使用快速枚舉。 。

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

,我不知道一個事實,這是快,但最終分配,你可以使用: maxX的= MAX(maxX,newX); 等... – 2011-08-29 16:53:56

21

在這種情況下,您應該使用-[CPPlotSpace scaleToFitPlots:]。有關數組值的更一般計算,請繼續閱讀...

這是鍵值編碼和相關聯的array operators的理想用法。在你的榜樣,

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這給通過對數組運算符(即@min權和關鍵路徑數組中的每個成員上調用同一個valueForKeyPath:建立了一個數組@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; 
} 
+0

謝謝巴里,你的迴應非常有幫助。你知道是否還有軸的自動調整功能? – Kevin 2010-02-26 20:39:52

+0

「CPAxis」類支持自動標記策略('CPAxisLabelingPolicyAutomatic')。我認爲該軸會自動跨越繪圖空間,因此您只需將標記策略設置爲自動,然後在繪圖空間更改大小時將其標記爲重新標記。 – 2010-02-26 23:11:23

+0

@BarryWark如果我有兩個或更多的不同陣列被繪製在同一個圖形區域中,該怎麼辦?我如何獲取所有陣列中最小和最大的Y值? – 2013-02-27 22:15:42

0

,如果你有NSDictionary中的NSMutableArray的對象,您可以使用此:

-(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]; 
相關問題