2

我正在尝试找出对NSMutableDictionary. 我有一个存储卡值(即 14)的卡键字典(即 aceSpades)。然后我一直在使用NSMutableArray将 52 个卡片键洗牌到一个名为 shuffledCards 的数组中。最后,我从 shuffledCards 中制作了另一个数组,该数组需要一部分(15)的 shuffledCards 并将它们放入一个名为 computerHand 的数组中。

新数组 computerHand 不够好,因为我需要能够将 Card 值与 Card 键连接起来。我真正需要做的是NSMutableDictionary从数组 shuffledCards 为 computerHand 创建一个新的,以便我可以按 Card 值对其进行排序,并且仍然能够检索 Card 键。

我想我需要这样的东西,其中 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;
    }];

谢谢大家!

4

2 回答 2

2

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

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

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

 NSArray* objects = [dict objectsForKeys:sortedKeys notFoundMarker:[NSNull null]];
于 2013-10-09T20:05:38.030 回答
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
)
于 2013-10-09T21:33:02.063 回答