2011-01-12 17 views
1

Ich muss ein NSDictionary von Wörterbüchern sortieren. Es sieht aus wie:Problem mit dem Sortieren von NSDictionary

{//dictionary 
     RU = "110.1"; //key and value 
     SG = "150.2"; //key and value 
     US = "50.3"; //key and value 
    } 

Ergebnis sein müssen wie:

{//dictionary 
      SG = "150.2"; //key and value 
      RU = "110.1"; //key and value 
      US = "50.3"; //key and value 
     } 

Ich versuche dies:

@implementation NSMutableDictionary (sorting) 

-(NSMutableDictionary*)sortDictionary 
{ 
    NSArray *allKeys = [self allKeys]; 
    NSMutableArray *allValues = [NSMutableArray array]; 
    NSMutableArray *sortValues= [NSMutableArray array]; 
    NSMutableArray *sortKeys= [NSMutableArray array]; 

    for(int i=0;i<[[self allValues] count];i++) 
    { 
     [allValues addObject:[NSNumber numberWithFloat:[[[self allValues] objectAtIndex:i] floatValue]]]; 
    } 



    [sortValues addObjectsFromArray:allValues]; 
    [sortKeys addObjectsFromArray:[self allKeys]]; 
    [sortValues sortUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"floatValue" ascending:NO] autorelease]]]; 

    for(int i=0;i<[sortValues count];i++) 
    { 
     [sortKeys replaceObjectAtIndex:i withObject:[allKeys objectAtIndex:[allValues indexOfObject:[sortValues objectAtIndex:i]]]]; 
     [allValues replaceObjectAtIndex:[allValues indexOfObject:[sortValues objectAtIndex:i]] withObject:[NSNull null]]; 
    } 
    NSLog(@"%@", sortKeys); 
    NSLog(@"%@", sortValues); 
    NSLog(@"%@", [NSMutableDictionary dictionaryWithObjects:sortValues forKeys:sortKeys]); 
    return [NSMutableDictionary dictionaryWithObjects:sortValues forKeys:sortKeys]; 
} 

@end 

Dies ist das Ergebnis von NSLog ist: 1)

{ 
SG, 
RU, 
US 
} 

2)

{ 
150.2, 
110.1, 
50.3 
} 

3)

{ 
      RU = "110.1"; 
      SG = "150.2"; 
      US = "50.3"; 
     } 

Warum ist das passiert? Kannst du mir bei diesem Problem helfen?

Antwort

1

Ein NSDictionary ist nicht ordened, es spielt also keine Rolle in welcher Reihenfolge Sie einen NSDIctionary erstellen.

Ein NSArray ist ordened. Wenn Sie das NSDictionary in Arbeitsspeicher gespeichert haben möchten, sollten Sie irgendwie ein NSArray von Schlüsselwertpaaren erstellen. Sie können auch zwei NSArrays mit entsprechenden Indizes zurückgeben.

Wenn Sie nur über den Weg der Elemente iterieren möchten, können Sie über eine sortierte Reihe von Schlüsseln iterieren (das ist, was koregan vorschlägt).

+0

ok. Danke, Jungs. –

5

NSDictionary sind unsortiert von der Natur. Die Reihenfolge der Objekte, wie sie von allKeys und allValues abgerufen werden, ist immer unbestimmt. Auch wenn Sie die Bestellung zurückentwickeln, kann sich dies beim nächsten Systemupdate noch ändern.

Es ist jedoch leistungsfähigere Alternativen zu allKeys, die verwendet werden, um die Schlüssel in einer definierten und vorhersagbaren Reihenfolge abzuzurufen:

  • keysSortedByValueUsingSelector: - für die Sortierung in aufsteigender Reihenfolge nach der compare: Methode der Wertobjekte nützlich.
  • keysSortedByValueUsingComparator: - Neu in iOS 4, verwenden Sie einen Block, um die Sortierung inline zu tun.
2

WOW. Danke, PeyloW! Es ist was ich brauchte! Ich finde auch diesen Code und es hilft mir, Ergebnisse neu zu ordnen:

@implementation NSString (numericComparison) 

- (NSComparisonResult) floatCompare:(NSString *) other 
{ 
    float myValue = [self floatValue]; 
    float otherValue = [other floatValue]; 
    if (myValue == otherValue) return NSOrderedSame; 
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

- (NSComparisonResult) intCompare:(NSString *) other 
{ 
    int myValue = [self intValue]; 
    int otherValue = [other intValue]; 
    if (myValue == otherValue) return NSOrderedSame; 
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

@end 
+3

Mein Vergnügen. Vergessen Sie nicht, die Antwort zu akzeptieren, die Sie für richtig halten. Hilft anderen Benutzern bei der Suche nach Antworten und gut für mein Ego :). – PeyloW

Verwandte Themen