有没有一种简单的方法可以按键值对 plist(字典数组)进行排序?

Posted

技术标签:

【中文标题】有没有一种简单的方法可以按键值对 plist(字典数组)进行排序?【英文标题】:Is there an easy way of sorting a plist (array of dictionaries) by key value? 【发布时间】:2009-05-14 16:37:42 【问题描述】:

我需要按 Key 值重新排序 plist(字典数组)。

在此示例内容中,我想按键名称 (Matt, Joe) 的值排序:

<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 编辑器、文本编辑器或其他任何工具。

【问题讨论】:

数组将按顺序存储,因此将键本身存储为单独的有序数组。每当您从字典中添加或删除键时,对键数组执行相同操作并重新排序,然后再将 plist 写回磁盘。 如果我要那样做,如何获取有序数组中的键? 将每个字典中 name 的所有值添加到一个可变数组中,然后在数组上调用 sortedArrayUsingSelector:@selector(compare:) 。这将为您提供一个新的、排序的名称键数组。 【参考方案1】:

这是另一种编码解决方案,但制作一个围绕它的基本命令行工具并不难:

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

【讨论】:

在创建数组后不要忘记释放排序描述符。 iPhone 没有 GC。 为大正义添加了版本 :)【参考方案2】:

我写了一个从标准输入读取并写入标准输出的小 Python 脚本:

# sortplist.py
import plistlib
import sys

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

所以,只需python sortplist.py &lt;original.plist &gt;sorted.plist

【讨论】:

这根本没有帮助我的应用程序的 Info.plist 排序。 Xcode 中键的顺序保持不变,差异最小。 对不起,@fatuhoku。自从我写下这个答案以来,plistlib 的行为可能在几年内发生了变化。它曾经对它们进行排序。【参考方案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...

【讨论】:

【参考方案4】:

Python 是你的朋友:http://effbot.org/zone/element-sort.htm :-)

【讨论】:

谢谢,不过我不懂 Python。 :) Ramin,小世界 - 我在 Twitter 上关注你。【参考方案5】:

我最终编写了一个五行 php 脚本来重新排序它们。我想我还有很多 Cocoa 需要学习,才能快速、舒适地完成一些事情。

感谢您的回答。

【讨论】:

在这种情况下使用脚本并没有什么问题,因为您不必仅为一项任务创建和构建项目。

以上是关于有没有一种简单的方法可以按键值对 plist(字典数组)进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将 .plist 数据读入字典

从 plist 读取字典后无法编辑字典

从 plist 文件中读取字典的奇怪行为

字典的 plist 或存储

使用Plist编辑器——简单入门指南

使用Plist编辑器——简单入门指南