排序NSDictionary的问题

时间:2011-01-12 17:19:39

标签: iphone sorting nsdictionary

我需要对字典的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 个答案:

答案 0 :(得分:5)

NSDictionary本质上没有排序。由allKeysallValues检索的对象的顺序将始终未确定。即使您对订单进行逆向工程,它仍可能在下一次系统更新中发生变化。

然而,allKeys有更强大的替代方法可用于以定义和可预测的顺序检索密钥:

  • keysSortedByValueUsingSelector: - 用于根据值对象的compare:方法按升序排序。
  • keysSortedByValueUsingComparator: - iOS 4中的新功能,使用块进行内联排序。

答案 1 :(得分:2)

WOW。 Thanx,PeyloW!这就是我需要的!我也找到了这段代码,它帮助我重新排序结果:

@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

答案 2 :(得分:1)

NSDictionary没有ordened,因此构建NSDIctionary的顺序无关紧要。

NSArray已经过了。如果你想在内存中安装NSDictionary,你应该以某种方式制作一个关键值对的NSArray。您还可以返回两个具有相应indeces的NSArrays。

如果你只想迭代元素方式,你可以迭代一个有序的键数组(这是koregan建议的)。