2010-08-23 38 views
0

如何搜索我的字典以查询最接近的值?说我搜索0.000475,我知道它不可用,但我想返回它最接近的值0.000500。NSDictionary:如何通过匹配或最接近的值进行过滤

我想我会使用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

由于keysOfEntriesPassingTest返回一组值,这将是更适合的任务就像找到距离你的查询值给定的小量范围内的所有键,但在这种情况下,没有找到一个最接近的关键样。

所以这里的做到这一点的一种方式,但它肯定是有点低效率:

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的关键次优比赛等

编辑:亚普,如果你不需要其他的比赛,几乎可以肯定是一个更好的主意,只要调用enumerateKeysAndObjectsUsingBlock:结合一个变量在传递的块以外的变量,保存最近的键/值找到目前为止的匹配项,并在当前值接近查询值时更新它。

+0

谢谢,解决了。我会看看enumerateKeysAndObjectsUsingBlock。只要让我的脚湿透目标c – Ronn 2010-08-23 18:33:42

相关问题