如何从NSMutableArray创建NSMutableDictionary?

时间:2013-10-09 19:49:56

标签: objective-c nsmutablearray nsmutabledictionary

我正试图找出对NSMutableDictionary进行排序的最佳方法。我有一个存储卡值(即14)的卡密钥字典(即aceSpades)。然后我一直使用NSMutableArray将52个Card密钥重新组合成一个名为shuffledCards的数组。最后,我从shuffledCards创建另一个数组,它接受一部分(15)shuffledCards并将它们放入一个名为computerHand的数组中。

新阵列计算机手机不够好,因为我需要能够使用卡片密钥连接卡片值。我真正需要做的是从数组shuffledCards为computerHand创建一个新的NSMutableDictionary,以便我可以按卡值对其进行排序,并且仍然能够检索卡片密钥。

我想我需要这样的东西,其中currentCard是shuffedCards数组的第一张牌:

if (currentCard == 1) {
    [compHandDictionary setObject:[[highCardDictionary 
                      valueForKey:[shuffledCards objectAtIndex:currentCard]] intValue] 
                           forKey:[cardsShuffled objectAtIndex:currentCard]];
} 

但是这是不允许的,因为不允许“int”到“id”。

可能有更好的方法,但我找不到任何东西。任何帮助将不胜感激。

...

我通过修改jstevenco的答案来解决这个问题。我创建了两个数组,并为15张卡的计算机手形成了一个新的字典。然后对我使用的排序:

NSArray* sortedKeys = [newDict keysSortedByValueUsingComparator: ^(id obj1, id     obj2) {

        if ([obj1 integerValue] > [obj2 integerValue]) {
            return (NSComparisonResult)NSOrderedAscending;
        }

        if ([obj1 integerValue] < [obj2 integerValue]) {
            return (NSComparisonResult)NSOrderedDescending;
        }
        return (NSComparisonResult)NSOrderedSame;
    }];

全部谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用以下方式对字典的键进行排序:

 NSArray* sortedKeys = [[dict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

如果您想从中创建排序数组,可以使用:

 NSArray* objects = [dict objectsForKeys:sortedKeys notFoundMarker:[NSNull null]];

答案 1 :(得分:0)

考虑使用字典数组,其中每个字典包含给定卡的名称和值,例如:

NSArray *cards = @[@{@"name" : @"Queen", @"value" : @12},
                   @{@"name" : @"Jack", @"value" : @11},
                   @{@"name" : @"Ace", @"value" : @14},
                   @{@"name" : @"King", @"value" : @13}];

然后您可以轻松地对cards数组进行排序,如下所示:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"value" ascending:YES];
NSArray *sortedCards = [cards sortedArrayUsingDescriptors:@[sortDescriptor]];

NSLog(@"\n\n%@\n\n", sortedCards);

上面NSLog语句的输出如下:

(
    {
        name = Jack;
        value = 11;
    },
        {
        name = Queen;
        value = 12;
    },
        {
        name = King;
        value = 13;
    },
        {
        name = Ace;
        value = 14;
    }
)

要获取卡片名称数组,您只需向已排序的卡片词典数组发送valueForKey:消息:

NSArray *sortedNames = [sortedCards valueForKey:@"name"];

NSLog(@"\n\n%@\n\n", sortedNames);

前面的NSLog语句的输出将是:

(
    Jack,
    Queen,
    King,
    Ace
)