2010-08-23 4 views
0

Comment rechercher dans mon dictionnaire la valeur la plus proche de la requête? Dites que je recherche 0.000475, je sais que ce n'est pas disponible, mais je veux retourner c'est la valeur la plus proche 0.000500.NSDictionary: Comment filtrer par correspondance ou valeur la plus proche

Je suppose que j'utiliserais keysOfEntriesPassingTest pour atteindre cet objectif sur un dictionnaire, sans savoir comment y remédier.

<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> 

Répondre

1

Depuis keysOfEntriesPassingTest retourne un ensemble de valeurs, il serait mieux adapté à une tâche comme trouver toutes les clés qui sont dans une plage de epsilon donné de la valeur de votre requête, mais ne pas trouver la clé la plus proche unique comme dans ce cas, .

Voici donc une façon de le faire, mais il est certainement un peu inefficace:

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] ensuite la touche de la valeur avec la meilleure correspondance, l'indice 1 la clé de la deuxième meilleure match, etc

edit: yap, si vous n'avez pas besoin des autres correspondances, il est presque certainement une meilleure idée de simplement appeler enumerateKeysAndObjectsUsingBlock: en conjonction avec une variable en dehors du bloc passé qui contient la clé/valeur du plus proche correspondance trouvée jusqu'à présent et la met à jour si la valeur actuelle est plus proche de la valeur de la requête.

+0

Merci, ça a marché. Je vais regarder enumerateKeysAndObjectsUsingBlock. Juste me mouiller les pieds avec l'objectif c – Ronn

Questions connexes