2009-05-14 9 views
4

Ich muss eine PLIST (eine Reihe von Diktaturen) nach Schlüsselwert neu anordnen.Gibt es eine einfache Möglichkeit, ein Plist (Array von Wörterbüchern) nach Schlüsselwert zu sortieren?

In diesem Beispiel Inhalten durch den Wert für den Schlüssel-Namen (Matt, Joe) bestellen Ich mag würde:

<dict> 
    <key>Name</key> 
    <string>Matt</string> 
    <key>Details</key> 
    <string>Me</string> 
</dict> 
<dict> 
    <key>Name</key> 
    <string>Joe</string> 
    <key>Details</key> 
    <string>You</string> 
</dict> 

Gibt es eine einfache Art und Weise? Ich möchte es nicht jedes Mal, wenn die App ausgeführt wird, im Code ausführen, sondern nur in die Datendatei.

Irgendwelche Ideen?

Glücklich, jedes Werkzeug zu verwenden, um dies zu tun: Ninja-Parameter für die Sortierung in der Befehlszeile, ein Plist-Editor, Texteditor oder was auch immer.

+0

Arrays werden in der richtigen Reihenfolge gespeichert. Speichern Sie die Schlüssel daher als separates, geordnetes Array. Jedes Mal, wenn Sie einen Schlüssel aus dem Wörterbuch hinzufügen oder entfernen, führen Sie das gleiche für das Schlüsselarray durch und ordnen Sie es neu, bevor Sie den plist zurück auf den Datenträger schreiben. –

+0

Wenn ich so gehe, wie bekomme ich die Schlüssel in einem geordneten Array? –

+0

Fügen Sie alle Werte für den Namen aus jedem Wörterbuch zu einem veränderbaren Array hinzu und rufen Sie dann sortedArrayUsingSelector: @selector (compare :) für das Array auf. Dadurch erhalten Sie ein neues, sortiertes Array der Namenschlüssel. –

Antwort

0

Ich schrieb ein fünfzeiliges PHP-Skript, um sie neu zu ordnen. Ich denke, ich muss noch viel Kakao lernen, bevor ich etwas schnell und bequem damit machen kann.

Vielen Dank für Ihre Antworten.

+0

Es ist nichts falsch mit der Verwendung eines Skripts in diesem Fall, es ist wahrscheinlich einfacher, da Sie nicht ein Projekt nur für eine Aufgabe erstellen und erstellen müssen. –

+0

Genau meine Gedanken, Marc. –

3
// Our key array 
NSMutableArray *unsortedKeys = [NSMutableArray array]; 
// Assume we have some array of dictionaries 
for(NSDictionary *dict in dictionaryArray) { 
    NSString *key = [dict objectForKey:@"Name"]; 
    if(key) 
    [unsortedKeys addObject:key]; 
} 
NSArray *sortedKeys = [unsortedKeys sortedArrayUsingSelector:@selector(compare:)]; 

// Do things with the keys... 
0

Python ist dein Freund: http://effbot.org/zone/element-sort.htm :-)

+0

Danke, ich weiß Python nicht. :) –

+1

Du hast Ninjas erwähnt, oder? Und dann gibt es: http://xkcd.com/353/ :-) – Ramin

+0

Ramin, kleine Welt - ich folge dir auf Twitter. –

13

Dies ist ein weitere Codierung Lösung ist, aber es wäre ein grundlegendes Kommandozeilen-Tool zu machen, die um ihn herum gewickelt nicht schwer:

NSArray* arrayOfDictionaries; //the array we want to sort 
NSSortDescriptor* nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES]; 
NSArray* sortedArray = [arrayOfDictionaries sortedArrayUsingDescriptors:[NSArray arrayWithObject:nameSortDescriptor]]; 
[nameSortDescriptor release]; 
+2

Vergessen Sie nicht, den Sortierungsdeskriptor nach dem Erstellen des Arrays damit freizugeben. Das iPhone hat keinen GC. –

+0

Release hinzugefügt für große Gerechtigkeit :) –

5

schrieb ich einen kleinen Python-Skript, das von der Standardeingabe liest und schreibt auf der Standardausgabe:

# sortplist.py 
import plistlib 
import sys 

plist = plistlib.readPlist(sys.stdin) 
plistlib.writePlist(plist, sys.stdout) 

Also, python sortplist.py <original.plist >sorted.plist nur.

+0

Das hat nicht geholfen, die Info.plist meiner App überhaupt zu sortieren. Die Reihenfolge der Schlüssel in Xcode bleibt gleich und das diff ist minimal. – fatuhoku

+0

Tut mir leid, @fatuhoku. Das Verhalten von plistlib hat sich möglicherweise in den Jahren geändert, seit ich diese Antwort geschrieben habe. Es hat sie sortiert. –

Verwandte Themen