2012-10-04 13 views
10

Quando aggiungo i valori in NSMutableDictionary si imposta automaticamente Key wise. Come posso disabilitarlo e organizzare in base al primo set e al secondo set secondo.Come disattivare NSDictionary Ordina automaticamente key wise

NSMutableDictionary* filteredDictionary = [NSMutableDictionary dictionary]; 

[filteredDictionary setObject:@"abc" forKey:@"1"]; 
[filteredDictionary setObject:@"abc" forKey:@"3"]; 
[filteredDictionary setObject:@"abc" forKey:@"2"]; 
[filteredDictionary setObject:@"abc" forKey:@"5"]; 
[filteredDictionary setObject:@"abc" forKey:@"4"]; 

NSLog(@"%@",filteredDictionary); 

current output: 
{ 
1 = abc; 
2 = abc; 
3 = abc; 
4 = abc; 
5 = abc;  
} 

but i want 
{ 
1 = abc; 
3 = abc; 
2 = abc; 
5 = abc;  
4 = abc; 
} 

C'è un modo per disabilitare l'ordinamento come da chiave?

+1

So che questo è il vero problema con il dizionario. Ma posso aiutarvi con un modo alternativo di farlo. Inoltre, ci saranno piccoli cambiamenti nell'accesso ai valori. Inoltre, non capisco qual è il problema che stai affrontando a causa di questo, dopotutto hai bisogno di accedervi solo con KeyValue. –

+0

@amitrajput yes è il punto –

+0

Ordina solo le chiavi quando si stampa la stringa descrittiva, non cambia il layout della memoria basato su una tabella hash. Se si enumera attraverso di esso, non verrà ordinato in quanto ha lo scopo di darvi un accesso veloce. –

risposta

2

Ecco un modo per farlo:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES comparator:^(id obj1, id obj2) { 

    if (obj1 > obj2) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 
    if (obj1 < obj2) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}]; 

NSArray *sortedKeys = [[filteredDictionary allKeys] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

NSMutableDictionary *orderedDictionary = [NSMutableDictionary dictionary]; 

for (NSString *index in sortedKeys) { 
    [orderedDictionary setObject:[filteredDictionary objectForKey:index] forKey:index]; 
} 

filteredDictionary = orderedDictionary; 
+0

Questo codice non viene compilato poiché non esiste alcun metodo 'addObject' disponibile in [NSMutableDictionary] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference. html), chiedendosi come ha funzionato per OP. –

+0

Wow, dovevo essere in crisi quando ho scritto che ... lo aggiusterò! Grazie per averlo individuato. –

1

NSDictionary non è destinato a essere ordinato. Puoi ottenerlo ordinato prendendo tutte le chiavi usando allKeys e ordinando quella matrice a tuo piacimento. Quindi esegui un ciclo attraverso questa matrice e ottieni i valori corrispondenti.

+0

ma come se lo sapessi, per favore dimmelo. –

+0

Vedi i post di Joachim e Simon. – Rengers

4

NSDictionary non è l'ordinamento delle chiavi, l'ordine delle chiavi in ​​un dizionario è non definito poiché è una raccolta non ordinata.

Ciò significa che non è possibile fidarsi dell'ordine degli elementi quando li si recupera/li stampa a meno che non si usi keysSortedByValueUsingSelector: o keysSortedByValueUsingComparator: per ordinarli mentre li si preleva.

È inoltre possibile vedere questo nel manuale di allKeys;

Return Value
un nuovo array che contiene le chiavi del dizionario, o un array vuoto se il dizionario ha entrate.

Discussione
L'ordine degli elementi nell'array è non definito.

Non v'è alcun modo di tenere le chiavi/valori ordinati come si desidera in un NSDictionary, quindi se avete bisogno di loro ordinato nello stesso ordine in cui vengono aggiunti, avete fondamentalmente due opzioni;

  • aggiungerli a/rimuoverli da una raccolta ordinata - come ad esempio un NSArray - allo stesso tempo, come li si aggiunge alla NSDictionary, e utilizzare che collezione per l'accesso ordinato.
  • Aggiungere un campo ai dati che si aggiungono al dizionario che conta per ogni aggiunta, quindi utilizzare quel campo con keysSortedByValueUsingComparator: per ordinarlo quando si prelevano tutte le chiavi dall'array.
1

In NSDictionary non sarà possibile ottenere i dati, come si sta inserendo.
È possibile utilizzare la matrice se si desidera ottenere dati in base ai dati che si sta inserendo,