Проблема с сортировкой NSDictionary - PullRequest
1 голос
/ 12 января 2011

Мне нужно отсортировать NSDictionary словарей. Похоже:

{//dictionary
        RU = "110.1"; //key and value
        SG = "150.2"; //key and value
        US = "50.3"; //key and value
    }

Результат должен быть таким:

 {//dictionary
            SG = "150.2"; //key and value
            RU = "110.1"; //key and value
            US = "50.3"; //key and value
        }

Я пытаюсь это:

@implementation NSMutableDictionary (sorting)

-(NSMutableDictionary*)sortDictionary
{
    NSArray *allKeys = [self allKeys];
    NSMutableArray *allValues = [NSMutableArray array];
    NSMutableArray *sortValues= [NSMutableArray array];
    NSMutableArray *sortKeys= [NSMutableArray array];

    for(int i=0;i<[[self allValues] count];i++)
    {
        [allValues addObject:[NSNumber numberWithFloat:[[[self allValues] objectAtIndex:i] floatValue]]];   
    }



    [sortValues addObjectsFromArray:allValues];
    [sortKeys addObjectsFromArray:[self allKeys]];
    [sortValues sortUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"floatValue" ascending:NO] autorelease]]];

    for(int i=0;i<[sortValues count];i++)
    {
        [sortKeys replaceObjectAtIndex:i withObject:[allKeys objectAtIndex:[allValues indexOfObject:[sortValues objectAtIndex:i]]]];
        [allValues replaceObjectAtIndex:[allValues indexOfObject:[sortValues objectAtIndex:i]] withObject:[NSNull null]];
    }
    NSLog(@"%@", sortKeys);
    NSLog(@"%@", sortValues);
    NSLog(@"%@", [NSMutableDictionary dictionaryWithObjects:sortValues forKeys:sortKeys]);
    return [NSMutableDictionary dictionaryWithObjects:sortValues forKeys:sortKeys];
}

@end

Это результат NSLog: 1)

{
SG,
RU,
US
}

2)

{
150.2,
110.1,
50.3
}

3)

{
            RU = "110.1";
            SG = "150.2";
            US = "50.3";
        }

Почему это происходит? Можете ли вы помочь мне с этой проблемой?

Ответы [ 3 ]

5 голосов
/ 12 января 2011

NSDictionary по природе не отсортированы. Порядок объектов, полученный с помощью allKeys и allValues, всегда будет неопределенным. Даже если вы измените порядок заказа, он все равно может измениться в следующем обновлении системы.

Однако существуют более мощные альтернативы allKeys, которые используются для извлечения ключей в определенном и предсказуемом порядке:

  • keysSortedByValueUsingSelector: - Полезно для сортировки в порядке возрастания в соответствии с методом compare: объектов-значений.
  • keysSortedByValueUsingComparator: - Новое в iOS 4, используйте блок для выполнения встроенной сортировки.
2 голосов
/ 12 января 2011

WOW. Спасибо, ПейлоВ! Это то, что мне было нужно! Я также нахожу этот код, и он помогает мне изменить порядок результатов:

@implementation NSString (numericComparison)

- (NSComparisonResult) floatCompare:(NSString *) other
{
    float myValue = [self floatValue];
    float otherValue = [other floatValue];
    if (myValue == otherValue) return NSOrderedSame;
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending);
}

- (NSComparisonResult) intCompare:(NSString *) other
{
    int myValue = [self intValue];
    int otherValue = [other intValue];
    if (myValue == otherValue) return NSOrderedSame;
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending);
}

@end
1 голос
/ 12 января 2011

NSDictionary не упорядочен, поэтому не имеет значения, в каком порядке вы создаете NSDIctionary.

NSArray заказан. Если вы хотите, чтобы NSDictionary был упорядочен в памяти, вы должны каким-то образом создать NSArray из пар ключ-значение. Вы также можете вернуть два NSArrays с соответствующими индексами.

Если вы хотите перебирать только элементы, вы можете перебирать отсортированный массив ключей (это то, что предлагает koregan).

...