按对象排序NSMutableDictionary键?

时间:2011-08-05 12:30:05

标签: iphone sorting nsmutabledictionary

Okeh。这是交易: 有一个NSMutualDictionary,单词作为键(比如名字)。值对象是NSNumber(如评级)

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setObject:[NSNumber intValue:1] forKey:@"Melvin"];
[dictionary setObject:[NSNumber intValue:2] forKey:@"John"];
[dictionary setObject:[NSNumber intValue:3] forKey:@"Esben"];

我想先按最高等级对它们进行排序。

我知道我会这样做:

[searchWords keysSortedByValueUsingSelector:@selector(intCompare:)];

但不确定如何实现intCompare。 (比较方法)

有人能指出我正确的方向吗?

- (NSComparisonResult) intCompare:(NSString *) other
{
//What to do here?
}

我想和{Esben,John,Melvin}一起获得NSArray。

3 个答案:

答案 0 :(得分:1)

These constants are used to indicate how items in a request are ordered.

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;

这取自Apple关于数据类型的开发文档...现在您要做的就是检查哪一个更大。所有这一切都是为你完成的。只需传入@selector(比较:)即可。由于您的值是NSNumbers,NSNumber实现了compare:函数。这是你想要的:)

答案 1 :(得分:1)

NSArray *sortedArray = [searchWords sortedArrayUsingSelector:@selector(compare:) ];

或者你可能会使用,这里是你的intCompare选择器的实现

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

}

答案 2 :(得分:1)

由于您放入字典的对象是NSNumber个实例,因此您应该稍微更改方法签名。但是完整的实现非常简单:

-(NSComparisonResult)intCompare:(NSNumber*)otherNumber {
    return [self compare:otherNumber];
}

事实上,当您可以使用intCompare: compare:已经拥有的NSNumber时,我认为您没有必要使用自己的{{1}}方法。