2010-08-23 55 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