【问题标题】:Return value closest to 0 including negative numbers返回最接近 0 的值,包括负数
【发布时间】:2015-09-21 03:43:11
【问题描述】:

我有一个NSDictionary,我想返回最接近零的对应键(包括那些带有负数的键):

NSDictionary *dict = @{
                       @"David" : @-89,
                       @"Bobby" : @61,
                       @"Nancy" : @-8,
                       @"Sarah" : @360,
                       @"Steve" : @203
                      };

所以在这种情况下Nancy 是最接近的... 我怎样才能做到这一点?我搜索但空无一物。

【问题讨论】:

  • 用您目前尝试过的内容更新您的问题。说明您对代码有什么问题。
  • 我试过thisthisthisthis。问题是它们都没有处理负数。

标签: objective-c return nsdictionary


【解决方案1】:

这是一个简单的最大最小问题,

NSString *curMinKey = [dict.allKeys firstObject];
NSInteger curMinVal = ABS([[dict objectForKey:curMinKey] integerValue]);
for(id key in dict) {
    if(curMinVal > ABS([[dict objectForKey:key] integerValue])) {
        curMinKey = key;
        curMinVal = ABS([[dict objectForKey:key] integerValue]);
    }
}
/// curMinKey is what you are looking for

【讨论】:

  • 此代码无法按原样工作。您不能将 NSNumber 传递给 abs 函数。
  • @maddy:你能解释一下won't work吗?我试过了,它似乎返回了正确的结果。
  • 好像有警告Using integer absolute value function 'abs' when argument is of complex type, Use function 'cabsf' instead。当我包含 <complex.h> 标头并将其更改为 cabsf 时,警告将变为错误:Passing 'id _Nullable' to parameter of incompatible type '_Complex float'
  • @rmaddy 代码有效,但出现警告,因为该代码是从移动设备发布的,因此找不到正确的函数/方法。
【解决方案2】:

只需迭代值并跟踪哪个值最接近于零。使用 abs 处理绝对值。

免责声明 - 以下代码未经测试 - 可能是拼写错误。它还假设整数。根据需要进行调整以支持浮点值。

NSDictionary *dict = ... // your dictionary
NSInteger closestValue = NSIntegerMax;
NSString *closestKey = nil;
for (NSString *key in [dict allKeys]) {
    NSNumber *value = dict[key];
    NSInteger number = (NSInteger)labs((long)[value integerValue]);
    if (number < closestValue) {
        closestValue = number;
        closestKey = key;
    }
}

NSLog(@"Closest key = %@", closestKey);

【讨论】:

    猜你喜欢
    • 2019-12-15
    • 2018-12-28
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2021-03-22
    • 2019-06-24
    相关资源
    最近更新 更多