2

我有点困惑:试图获取我在 NSDictionary 中的玩家姓名和分数列表,并将它们按分数顺序排序(最高分在前)。我知道我不能对字典进行排序,所以我需要先将数据移动到一个数组中,但是这样做,我不会丢失每个字典键/值对的一半吗?

例如,假设我有以下对:

Bill / 10000
John / 7500
Stan / 7500
Mark / 5000

如果我去把分数拿出来排序,然后再取钥匙,约翰和斯坦不会因为他们的分数相同而混淆吗?它可能会调用其中一个两次,等等?

我意识到我无法对字典进行排序,但有更聪明的方法吗?

4

2 回答 2

4

您可以做的是根据他们的分数获得一个排序的玩家数组,然后为每个玩家创建一个字典并将它们附加到另一个数组中。可能是这样的(我正在使用新的文字语法,如果合适的话使用旧的):

NSDictionary *scores = @{
    @"Stan" : @7500,
    @"Mark" : @5000,
    @"John" : @7500,
    @"Bill" : @10000
};

NSArray *sp = [scores keysSortedByValueUsingComparator:^(id obj1, id obj2){
    return [obj2 compare:obj1];
}];

NSMutableArray *players = [NSMutableArray arrayWithCapacity:0];
for (NSString *p in sp) [players addObject:@{ @"name":p, @"score":scores[p] }];

现在你的players数组是:

(
        {
        name = Bill;
        score = 10000;
    },
        {
        name = John;
        score = 7500;
    },
        {
        name = Stan;
        score = 7500;
    },
        {
        name = Mark;
        score = 5000;
    }
)

PS。保留一个键是玩家姓名的字典不是一个好主意,考虑到你有 2 个不同的John玩家......那会发生什么?另外一个更好的解决方案是创建一个Player类并将其数据(分数、名称等)保留为属性。

于 2012-11-30T10:58:44.543 回答
0

您必须创建两个数组,一个用于得分,另一个用于播放器。关键是玩家数组与(排序的)分数数组的顺序相同。下面的实现假设您使用NSNumber对象保留分数,并且效率不是特别高,因为它对值进行了两次排序:

(未经测试)

NSDictionary *dict = ...;    // key=player (NSString), value=score (NSNumber).

NSArray *scores = [[dict allValues] sortedArrayUsingComparator:^(id obj1, id obj2) {
    return [(NSNumber *)obj2 compare:(NSNumber *)obj1];
}];

NSArray *players = [dict keysSortedByValueUsingComparator:^(id obj1, id obj2) {
    return [(NSNumber *)obj2 compare:(NSNumber *)obj1];
}];
于 2012-11-30T10:34:33.173 回答