NSDictionary сортировка по ключам как поплавки - PullRequest
11 голосов
/ 23 сентября 2010

в основном у меня есть NSDictionary с ключами и значениями.

Все ключи являются числами, но на данный момент они являются строками.

Я хочу иметь возможность сравнивать их как числа вЧтобы отсортировать их.

Например: если у меня есть словарь, подобный этому:

{
  "100"  => (id)object,
  "20"   => (id)object,
  "10"   => (id)object,
  "1000" => (id)object,
}

Я хочу иметь возможность сортировать его так:

{
  "10"   => (id)object,
  "20"   => (id)object,
  "100"  => (id)object,
  "1000" => (id)object,
}

Есть идеи?

Спасибо

Том

Ответы [ 3 ]

14 голосов
/ 23 сентября 2010

Не уверен, что вы делаете - словари изначально не отсортированы, в реализации по умолчанию отсутствует стабильное упорядочение ключей.Если вы хотите просмотреть значения по отсортированным ключам, вы можете сделать что-то вроде этого:

NSInteger floatSort(id num1, id num2, void *context)
{
    float v1 = [num1 floatValue];
    float v2 = [num2 floatValue];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}

NSArray *allKeys = [aDictionary allKeys];
NSArray *sortedKeys = [allKeys sortedArrayUsingFunction:floatSort context:NULL];
for (id key in sortedKeys)
    id val = [aDictionary objectForKey:key];
    …
8 голосов
/ 23 сентября 2010

Вы не можете отсортировать словарь, но вы можете получить ключи в виде массива, отсортировать их, а затем вывести в таком порядке. sortedArrayUsingComparator сделает это, и вы можете сравнить строки с параметром NSNumericSearch.

NSArray* keys = [myDict allKeys];
NSArray* sortedArray = [keys sortedArrayUsingComparator:^(id a, id b) { 
    return [a compare:b options:NSNumericSearch]; 
}]; 

for( NSString* aStr in sortedArray ) {
    NSLog( @"%@ has key %@", [myDict objectForKey:aStr], aStr );
}
1 голос
/ 23 сентября 2010

Используйте compare:options: с NSNumericSearch.

...