2010-08-23 2 views
0

사전에 검색어에 가장 가까운 값을 검색하려면 어떻게해야합니까? 0.000475를 검색한다고 가정 해 보겠습니다. 사용 가능하지 않지만 가장 가까운 값인 0.000500을 반환하고 싶습니다.NSDictionary : 일치 또는 가장 가까운 값으로 필터링하는 방법

사전에이를 달성하기 위해 keysOfEntriesPassingTest를 사용한다고 가정합니다. 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

은 쿼리 값에서 주어진 엡실론 범위 내에있는 모든 키를 찾을 수 있지만,이 경우처럼 하나의 가장 가까운 키를 찾지 못하는 것처럼 작업에 더 적합 할 것, 값의 집합을 반환 .

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:을 가장 가까운 키/값을 보유한 전달 된 블록 외부의 변수와 함께 호출하는 것이 좋습니다. 현재 값이 쿼리 값에 더 가깝다면 지금까지 발견 된 일치 항목을 업데이트합니다.

+0

감사합니다. enumerateKeysAndObjectsUsingBlock을 살펴 보겠습니다. 내 발을 객관적인 c로 젖게하는 것. – Ronn

관련 문제