2014-09-01 110 views
1

我有一個NSMutable數組,它們是從NSInteger值轉換而來的。如果我有負數和正數的混合,最終的結果是最小的正數是整體上最小的數字,即使有負數也是如此。如果所有的數字都是負數,它會找到最小的數字(例如-2,-1,-1將給出-2作爲最小值)。在數組中找到最小數字時不考慮負數

self.scoreArray = [[NSMutableArray alloc]initWithObjects:self.pOne, self.pTwo...etc]; 

NSNumber *min = self.scoreArray[0]; 
for (int i=0; i<[self.scoreArray count]; i++) { 
    if (self.scoreArray[i] < min) { 
    min = self.scoreArray[i]; 
    } 
NSLog(@"The smallest number is %@", min); 
} 

我該如何改變這個,使最小的數字(包括負數)總是正確的?

+0

'scoreArray'是否包含NSNumbers?你是否需要返回表示最小值的NSNumber實例或該實例的副本? – Jean 2014-09-01 23:17:58

+0

是的,'scoreArray'包含NSNumbers。我想返回NSNumber的實例。 – 2014-09-01 23:23:55

+0

然後,試試我的答案。它比較包含在NSNumbers中的integerValues,並返回包含最小值的NSNumber的實例。 – Jean 2014-09-01 23:28:28

回答

1

在您的代碼min不是int,它是一個指向NSNumber的實例的指針。 您必須比較integerValues。注意下面的代碼將返回原始的NSNumber,而不是副本。 我假設scoreArray包含NSNumber s。

self.scoreArray = [[NSMutableArray alloc]initWithObjects:self.pOne, self.pTwo...etc]; 

NSNumber *min = self.scoreArray[0]; 
for (int i=0; i<[self.scoreArray count]; i++) { 

if ([self.scoreArray[i] integerValue] < [min integerValue]) { 
    min = self.scoreArray[i]; 
    } 
NSLog(@"The smallest number is %@", min); 
} 
1

您正在使用c型操作來比較對象。這將導致指針地址的比較。如Jean所示,也不需要從對象創建c類型值,只需使用compare:方法即可。三種不同的方法吧:

你可以對數組進行排序,並只取第一個元素,以獲得簡單的代碼

NSArray *sortedNumbers = [self.scoreArray sortedArrayUsingComparator:^NSComparisonResult(NSNumber *n1, NSNumber *n2) { 
    return [n1 compare:n2]; 
}]; 
NSNumber *min = sortedNumbers[0]; 

,或者如果你不這樣做你的方法可以簡化

self.scoreArray = @[self.pOne, self.pTwo...etc]; 
__block NSNumber *min = @(NSIntegerMax); 

[self.scoreArray enumerateObjectsUsingBlock:^(NSNumber *n, NSUInteger idx, BOOL *stop) { 
    if ([n compare:min] == NSOrderedAscending) { 
     min = n; 
    } 
}]; 

像基於塊的枚舉,您應該使用快速枚舉

self.scoreArray = @[self.pOne, self.pTwo...etc]; 
NSNumber *min = @(NSIntegerMax); 

for (NSNumber *n in self.scoreArray) { 
    if ([n compare:min] == NSOrderedAscending) { 
     min = n; 
    } 
} 
1

您可以使用KVC檢索最小值 -

NSNumber *min = [self.scoreArray valueForKeyPath:@"@min.intValue"]; 
相關問題