NSDictionary:如何按匹配或最接近的值进行过滤

时间:2010-08-23 15:41:54

标签: objective-c nsdictionary

如何在字典中搜索与查询最接近的值?假设我搜索0.000475,我知道它不可用,但我想返回它最接近的值0.000500。

我想我会使用keysOfEntriesPassingTest在字典上实现这一点,但对如何解决这个问题一无所知。

<key>1/8000</key><real>0.000125</real> 
<key>1/6400</key><real>0.000156</real> 
<key>1/5000</key><real>0.000200</real> 
<key>1/4000</key><real>0.000250</real> 
<key>1/3200</key><real>0.000313</real> 
<key>1/2500</key><real>0.000400</real> 
<key>1/2000</key><real>0.000500</real> 
<key>1/1600</key><real>0.000625</real> 

1 个答案:

答案 0 :(得分:1)

由于keysOfEntriesPassingTest返回一组值,因此它更适合于从查询值中查找给定epsilon范围内的所有键,但不能找到像这种情况一样的单个最近键的任务

所以这是一种方法,虽然它确实有点低效:

NSDictionary* dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSNumber numberWithFloat:1.0],
                                                          [NSNumber numberWithFloat:2.0],
                                                          [NSNumber numberWithFloat:3.0], nil]
                                                 forKeys:[NSArray arrayWithObjects:@"foo", @"bar", @"baz", nil]];    
float query = ...;
NSArray* matches = [dict keysSortedByValueUsingComparator:^(id obj1, id obj2) {
    NSNumber* x = [NSNumber numberWithFloat:fabs([obj1 floatValue] - query)];
    NSNumber* y = [NSNumber numberWithFloat:fabs([obj2 floatValue] - query)];
    return [x compare:y];
}];
然后

[matches objectAtIndex:0]将保持具有最佳匹配的值的键,索引1为第二最佳匹配的键,等等。

编辑:yap,如果你不需要其他匹配,几乎肯定最好只调用enumerateKeysAndObjectsUsingBlock:和传递块之外的变量,它保存最接近匹配的键/值到目前为止找到并在当前值更接近查询值时更新它。