ios NSPredicate 在 NSDictionary 中查找最接近的值

标签 ios objective-c cocoa-touch nsdictionary nspredicate

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

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

这些是这样的, 对于 >=1 商品成本为 40对于 >=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 ;
        }
    }
}

最佳答案

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

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);

关于ios NSPredicate 在 NSDictionary 中查找最接近的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25197307/

相关文章:

ios - 处理 Apple 推送通知服务

objective-c - 自定义 iPhone 应用程序任务栏

ios - 随机 SpriteKit 纹理切换语句无法正常工作

iphone - 图像在 iOS 中用手指在屏幕上移动

ios - 在 ios 中没有调用 objc_getassociatedobject 的匹配函数

iOS 14 WidgetKit 在本地工作,但通过 TestFlight 失败

iphone - 远程 xml 文件和 uinavigationcontroller、nsurlconnection 放置

iOS - 推送另一个 View Controller 然后返回后更新自动布局约束常量停止工作

iphone - 如何取消 UIView setAnimationDelegate 上的委托(delegate) : call?

iphone - 最好使用全局或自定义命名的 GCD 队列?