2009-05-14 1 views
4

Мне нужно переупорядочить plist (массив диктаторов) по значению ключа.Есть ли простой способ сортировки plist (массив словарей) по значению ключа?

В этом примере содержание я хотел бы заказать по значению для ключа имя (Matt, Джо):

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

есть простой способ? Я не хочу делать это в коде каждый раз, когда приложение запускается, я просто хочу сделать это в файле данных.

Любые идеи?

С удовольствием используем любой инструмент для выполнения этого: параметры ниндзя для сортировки по командной строке, редактор plist, текстовый редактор или что-то еще.

+0

Массивы будут храниться в порядке, поэтому храните ключи самостоятельно как отдельный упорядоченный массив. Всякий раз, когда вы добавляете или удаляете ключ из словаря, делайте то же самое с массивом ключей и переупорядочивайте его до того, как вы напишете диск обратно на диск. –

+0

Если я иду таким образом, как мне получить ключи в упорядоченном массиве? –

+0

Добавьте все значения для имени из каждого словаря в изменяемый массив, затем вызовите sortedArrayUsingSelector: @selector (сравните :) в массиве. Это даст вам новый, отсортированный массив ключей имен. –

ответ

0

В итоге я написал пятистрочный PHP-скрипт, чтобы переупорядочить их. Наверное, у меня все еще есть много какао, чтобы учиться, прежде чем я смогу сделать что-то, что быстро и комфортно с ним.

Спасибо за ваши ответы.

+0

В этом случае нет ничего плохого в использовании скрипта, это, вероятно, проще, поскольку вам не нужно было создавать и строить проект только для одной задачи. –

+0

Точно мои мысли, Марк. –

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 является вашим другом: http://effbot.org/zone/element-sort.htm :-)

+0

Спасибо, я не знаю Python. :) –

+1

Вы упомянули ниндзя, не так ли? А потом есть: http://xkcd.com/353/ :-) – Ramin

+0

Ramin, маленький мир - Я следую за вами в Твиттере. –

13

Это другое решение кодирования, но это не было бы трудно сделать основной инструмент командной строки, которая обернута вокруг нее:

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

Не забудьте освободить дескриптор сортировки после создания массива с ним. У iPhone нет GC. –

+0

Релиз добавлен для большой справедливости :) –

5

Я написал небольшой скрипт на Python, который считывает данные из стандартного ввода и записи в стандартный вывод:

# sortplist.py 
import plistlib 
import sys 

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

Так, просто сделать python sortplist.py <original.plist >sorted.plist.

+0

Это не помогает сортировать Info.plist моего приложения вообще. Порядок ключей в Xcode остается неизменным, а diff - минимальным. – fatuhoku

+0

Извините, @fatuhoku. Поведение plistlib, возможно, изменилось за годы, прошедшие с тех пор, как я написал этот ответ. Раньше они сортировали их. –

Смежные вопросы