一个NSMutableArray的最小值和最大值是什么?

3

我有一段看似简单的代码,但却让我完全不知所措。

NSInteger ymax;
NSInteger ymin; 
NSInteger numberIndex1;
NSInteger numberIndex2;


for (NSNumber *theNumber in array2)
{
    if ([theNumber integerValue] > ymax) {
        ymax = [theNumber integerValue];
        numberIndex1 = [array2 indexOfObject:theNumber];
    }
}

for (NSNumber *theNumber in array2)
{
    if ([theNumber integerValue] < ymin) {
        ymin = [theNumber integerValue];
        numberIndex2 = [array2 indexOfObject:theNumber];
    }

} 

NSLog(@"Highest number: %d at index: %d", ymax, numberIndex1);
NSLog(@"Lowest number: %d at index: %d", ymin, numberIndex2);

NSLog输出为:

最高数字:129171656,索引为:-1073752392(嗯??)

最低数字:57,索引为:5(正确)

如何解释这种奇怪的行为?这两个函数看起来一样。一个能工作,而另一个不能?我已经尝试过很多方法,但仍然无法找到原因。任何帮助都将不胜感激。


按照上面的代码所述进行初始化。 - geekchic
1
抱歉,我没有看到你在哪里给NSIntegers赋初始值... - JP Illanes
你能展示一些array1或者array2的条目吗? - Srikar Appalaraju
1
@JohnWoods 这个数组很小,只有大约12个元素,最大的是一个三位数。@Raspu 奇怪的是,它似乎可以在没有任何初始值的情况下工作。但即使我尝试像这样用数组的第一个元素初始化它 NSInteger ymin = [array2 indexOfObject:0]; 我得到的结果也是一样的。 - geekchic
@SrikarAppal 没有什么花哨的东西。这是数组 array is ( 327, 95, 491, 95, 285, 57, 490, 345, 289, 175, 481, 346 ) - geekchic
显示剩余2条评论
5个回答

2
您可以使用以下代码获取最大值和最小值。这可能会对您有所帮助。
NSNumber * max = [array2 valueForKeyPath:@"@max.intValue"];
NSNumber * min = [array2 valueForKeyPath:@"@min.intValue"];
NSUInteger numberIndex1 = [array indexOfObject:min];
NSUInteger numberIndex2 = [array indexOfObject:max];

NSLog(@"Max Value = %d and index = %d",[max intValue],numberIndex1);
NSLog(@"Min Value = %d and index = %d",[min intValue],numberIndex2);

1
"indexOfObject:" 需要一个对象,而不是浮点数/整数或任何其他基本数据类型。 - Amresh Kumar
@RahulPatel 由于你在 valueForKeyPath: 中使用了 .intValue,如果 NSNumber 的实际值超出整数范围,逻辑将会出错。 - Amresh Kumar
@AmreshKumar,你说得对。这就是我一开始没有选择这种方法的原因。我的代码更长,但对我来说效果更好。 - geekchic
1
@AmreshKumar:你说得对,但是提问者没有定义哪些是值,所以我只是提供了代码的思路,而不是让人复制粘贴。 - Rahul Patel

1

享受我的答案……愉快编码

NSArray *arr1 = [[NSArray 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];

NSNumber * max = [arr1 valueForKeyPath:@"@max.floatValue"];
NSString *str=[NSString stringWithFormat:@"%@",max];
NSInteger path=[arr1 indexOfObject:str];
NSIndexPath *indepath=[NSIndexPath indexPathForItem:path inSection:0];

NSNumber * min = [arr1 valueForKeyPath:@"@min.floatValue"];
 NSString *str1=[NSString stringWithFormat:@"%@",min];
NSInteger path1=[arr1 indexOfObject:str1];
NSIndexPath *indepath1=[NSIndexPath indexPathForItem:path1 inSection:0];


NSLog(@"Max Value = %f and index = %ld",[max floatValue],(long)indepath.row);
NSLog(@"Min Value = %f and index = %ld",[min floatValue],(long)indepath1.row);

1
请初始化NSInteger ymax = 0; NSInteger ymin = 0 ; NSInteger numberIndex1 = 0; NSInteger numberIndex2 = 0; 这将解决您的问题。 否则它会检查垃圾值并给出错误的结果。

这解决了我得到最大值的问题。但现在最小值出错了。最高的数字:编号2处的491 最低的数字:编号0处的0但我认为像这样初始化NSInteger ymin = [array2 indexOfObject:0];应该可以解决这个问题。 - geekchic
@nikhitadkslfslg 是的。在大多数情况下,您也可以这样做。 - kumar123

1

如果我没记错的话,您正在考虑 NSInteger 的默认值是 0。不,它不能保证为零,因为它是一个本地自动变量。如果没有初始化,它的值是不确定的。

因此,您需要为您的变量设置默认值,可以从 ymax = -1 开始。


你说得对,那就是问题所在。然而,在这种情况下,ymax = 0; 可以正常工作,但 ymin 需要用数组的第一个元素进行初始化,否则会返回 null。 - geekchic
不一定,设置 ymin = NSIntegerMax; - Tarek Hallak
我之前不知道这个。这也很好用,谢谢。这个链接很有帮助。 - geekchic

-3
一个更合法的解决方案是:

NSArray *originalArray = @[[NSNumber numberWithInt:91],
                               [NSNumber numberWithInt:12],
                               [NSNumber numberWithInt:99123],
                               [NSNumber numberWithInt:9],
                               [NSNumber numberWithInt:43234]];
NSArray *sortedArray = [originalArray sortedArrayUsingSelector:@selector(compare:)];
NSNumber *minNumber = [sortedArray objectAtIndex:0];
NSNumber *maxNumber = [sortedArray lastObject];
NSInteger minIndex = [originalArray indexOfObject:minNumber];
NSInteger maxIndex = [originalArray indexOfObject:maxNumber];

1
备注:对于一个大数组,为了找到最小值和最大值而进行排序比枚举数组或使用键值编码方法更慢,请参考https://dev59.com/7GUo5IYBdhLWcg3wmAOh#15931719。 - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接