【问题标题】:ios NSPredicate to find nearest value in NSDictionaryios NSPredicate 在 NSDictionary 中查找最接近的值
【发布时间】:2014-08-08 06:34:51
【问题描述】:

我有一个 字典数组,如下所示:

(
{ key = 1, value = 40},
{ key = 4, value = 50},
{ key = 8, value = 60}
}

这些是这样的, for >=1 项目成本是 40, for >=4 项目成本是 50 和类似的明智。

我想获得 5 的值,在本例中为 50。

我试过的一段代码是:

NSMutableArray *wallpaperPriceArray = [[NSMutableArray alloc]init]; // Assuming this has all the dictionary values 

float wallpaperPriceValue = 0;

int itemNumber = 0;

for (int i = 0; i<wallpaperPriceArray.count; i++) {

int check = 0;

if(itemNumber >= [[wallpaperPriceArray objectAtIndex:i] intValue])
{
    wallpaperPriceValue = [[[wallpaperPriceArray objectAtIndex:i] objectForKey:@"value"] floatValue];
    check++;
}

if(i + 1 <= wallpaperPriceArray.count)
{
    if(itemNumber >= [[wallpaperPriceArray objectAtIndex:i+1] intValue] && itemNumber < [[wallpaperPriceArray objectAtIndex:i+1] intValue])
    {
        wallpaperPriceValue = [[[wallpaperPriceArray objectAtIndex:i+1] objectForKey:@"value"] floatValue];
        check++;

        if(check == 2)
        {
            break ;
        }
    }
}

if(i + 2 <= wallpaperPriceArray.count)
{
    if(itemNumber >= [[wallpaperPriceArray objectAtIndex:i+2] intValue] && itemNumber < [[wallpaperPriceArray objectAtIndex:i+2] intValue])
    {
        wallpaperPriceValue = [[[wallpaperPriceArray objectAtIndex:i+2] objectForKey:@"value"] floatValue];
        check++;

        if(check == 2)
        {
            break ;
        }
    }
}

【问题讨论】:

  • 您尝试的代码在哪里?
  • 请看一下尝试的代码\

标签: ios objective-c cocoa-touch nsdictionary nspredicate


【解决方案1】:

我不认为谓词是正确的,最好是枚举对象这里是一些示例代码:

NSArray *array = @[
                   @{ @"key" : @(1), @"value" : @(40)},
                   @{ @"key" : @(4), @"value" : @(50)},
                   @{ @"key" : @(8), @"value" : @(60)}
];

NSInteger searchedValue = 5; // <---

__block NSDictionary *closestDict = nil;
__block NSInteger closestValue = 0;


[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSDictionary *dict = obj;
    NSInteger key = [dict[@"key"] integerValue];

    // Check if we got better result
    if(closestDict == nil || (key > closestValue && key <= searchedValue)){
        closestDict = dict;
        closestValue = key;

        if(key == searchedValue) { *stop = YES; }
    }
}];

NSLog(@"value %@", closestDict);

【讨论】:

  • 欢迎您,我终于可以投票给我喜欢的答案了;)
【解决方案2】:

我会建议除了上面的答案使用样条方法来获得所需的值,这是在链接 https://github.com/soffes/SAMCubicSpline

使用这个库可以解决如下问题:

NSArray *array = @[
               @{ @"key" : @(1), @"value" : @(40)},
               @{ @"key" : @(4), @"value" : @(50)},
               @{ @"key" : @(8), @"value" : @(60)}];

SAMCubicSpline *spline = [[SAMCubicSpline alloc]    initWithPoints:@[


[NSValue valueWithCGPoint:CGPointMake(1.0f, 40.0f)],
  [NSValue valueWithCGPoint:CGPointMake(4.0f, 50f)],


 [NSValue valueWithCGPoint:CGPointMake(8.0f, 60.0f)],
]];

那么你可以通过这个获取任何值

CGFloat y = [spline interpolate:x];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2017-01-23
    • 2021-12-26
    • 1970-01-01
    • 2021-11-20
    • 2015-07-26
    相关资源
    最近更新 更多