10
votes

Comment désactiver la trieuse nsdimingary clés automatiquement sage

Quand j'ajoute des valeurs dans nsmutmédictionnement code> il définit automatiquement les clés sages. Comment puis-je le désactiver et organiser conformément au premier ensemble de premier et second ensemble.

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


4 commentaires

Je sais que c'est la véritable problème avec le dictionnaire.Mais, je peux vous aider avec une autre façon de le faire. En outre, il y aura des changements mineurs dans l'accès des valeurs.Leso, je ne comprends pas quelle est la question que vous êtes confrontée à cause de cela, après tout, vous devez y accéder par KeyValue uniquement.


@amitrajput oui c'est le point


Il trie uniquement les clés lors de la sortie de la chaîne de description, elle ne modifie pas la disposition de la mémoire qui est basée sur une table de hachage. Si vous l'énumérez, cela ne sera pas trié car il est censé vous donner un accès rapide.


@Vikasrajput Je ne veux pas trier le dictionnaire, mais ce que je veux, c'est la sortie, d'une manière, de sorte que, la façon dont je ajoute des clés au dictionnaire me donnera le même ordre de sortie.


4 Réponses :


1
votes

NSDictionary n'est pas censé être trié. Vous pouvez obtenir le tri en obtenant toutes les clés à l'aide de AllKeys et triant ce tableau à votre goût. Puis boucle via ce tableau et obtenez les valeurs correspondantes.


2 commentaires

Mais comment si vous savez s'il vous plaît dites-moi.


Voir les messages de Joachim et Simon.



4
votes

NSDictionary n'est pas trier vos clés, l'ordre des clés dans un dictionnaire est non défini , car il est une collection non ordonnée.

Cela signifie que vous ne pouvez pas faire confiance l'ordre des éléments lorsque vous Fetch / les imprimer sauf si vous utilisez keysSortedByValueUsingSelector: ou keysSortedByValueUsingComparator: pour les trier en les chercher .

Vous pouvez également voir dans le manuel de AllKeys ;

Valeur de retour
Un nouveau tableau contenant les clés du dictionnaire, ou un tableau vide si la dictionnaire n'a aucune entrée.

Discussion
L'ordre des éléments dans le tableau est ne sont pas définis.

Il n'y a pas moyen de garder les clés / valeurs ordonnées que vous le souhaitez dans un NSDictionary , donc si vous en avez besoin ordonné dans le même ordre que sont ajoutées, vous avez deux options; < / p>

  • Ajoutez-les à / les enlever d'une collection ordonnée - comme un NSArray - en même temps que vous les ajoutez à NSDictionary , et l'utilisation que collection pour l'accès commandé.
  • Ajouter un champ aux données que vous ajoutez au dictionnaire qui effectue un comptage pour chaque ajout, puis utilisez ce champ avec keysSortedByValueUsingComparator. pour le commander lors de la récupération de toutes les clés du tableau

0 commentaires

2
votes

Voici une façon de le faire:

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;


2 commentaires

Ce code ne parvient pas à compiler car il n'y a pas de AddObject Méthode disponible dans NSMutableddictionner , vous demandant comment cela a fonctionné pour OP.


Wow, je dois avoir été sur la crack quand j'ai écrit ça ... je vais le réparer! Merci de l'avoir taper.



1
votes

in NSDictionary Vous n'obtiendrez pas les données que vous insérez.
Vous pouvez utiliser un tableau si vous souhaitez obtenir des données en fonction des données que vous insérez,


0 commentaires