2013-10-09 114 views
3

我試圖找出排序NSMutableDictionary的最佳方法。我有一個存儲卡片值(即14)的卡片密鑰(即aceSpades)字典。然後,我使用NSMutableArray將52個卡片密鑰混洗成一個名爲shuffledCards的數組。最後,我從shuffledCards製作另一個數組,這個數組需要一部分(15)shuffledCards並將它們放入一個名爲computerHand的數組中。如何從NSMutableArray創建NSMutableDictionary?

新陣列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; 
    }]; 

謝謝大家!

+0

爲什麼你只是不使用原始字典來獲取卡片值? – Tricertops

+0

這就是我想要做的,但因爲我從沒有卡片值的數組創建新字典我還沒有找到可以從原始字典中獲取卡片值的代碼 –

+0

使用currentCard shuffledCards,我可以得到Card Key和High Card值,但是我需要弄清楚如何將這些值寫入一個新字典 –

回答

2

可以使用排序一個字典的鍵:

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

如果再要創建這個排序後的數組,你可以使用:

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

要說「你可以根據它的鍵對字典進行排序」有點不準確。字典本身不能被排序 - 它們是無序的集合。對鍵數組排序不會對它們從中獲取的字典進行排序。 – jlehr

+0

確實 - 我選擇的措辭不準確。我試圖傳達一個事實,即從字典中以有序方式檢索對象相對簡單。 – jstevenco

+0

我澄清了我的答案。 – jstevenco

0

考慮使用字典的數組,其中每個字典包含給定卡的名稱和值,例如像這樣:

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

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; 
    } 
) 

要獲得卡的名稱數組,然後你可以簡單地發送一個可隨後如下圖所示的cards陣列容易排序valueForKey:消息卡字典的排序後的數組:

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

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

前述的輸出將會是:

(
    Jack, 
    Queen, 
    King, 
    Ace 
) 
相關問題