ios NSPredicate 在 NSDictionary 中查找最接近的值
Posted
技术标签:
【中文标题】ios NSPredicate 在 NSDictionary 中查找最接近的值【英文标题】:ios NSPredicate to find nearest value in 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 ;
【问题讨论】:
您尝试的代码在哪里? 请看一下尝试的代码\ 【参考方案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];
【讨论】:
以上是关于ios NSPredicate 在 NSDictionary 中查找最接近的值的主要内容,如果未能解决你的问题,请参考以下文章