我正在创建一个需要内置词典的游戏。当用户单击一个按钮时,它将检查他们提交的单词是否是词典中的单词。
但是,我不知道这件事。我知道有很多方法可以存储诸如Foundation,Core Data,SQLite等数据。
最好的选择是什么?
而且,它必须100%完全离线!
任何建议,不胜感激!
谢谢
最佳答案
OK,看一下选项:
假设:您有一个单词列表。该列表的大小未知。假设这些单词的长度为“正常”,长度从一个字符到大约50个字符不等,并且在欧洲语言中或多或少地正常分布。
选项:
NSArray,大概是从plist加载的。
NSDictionary,大概是从plist加载的。
NSSet。 NSSet没有直接从plist还原的方法,因此可能必须从plist读取NSArray,然后从数组创建NSSet,这是一个相对简单的步骤。
尝试(基数树)。尽管可能在效率上与创建NSSet并没有太大区别,但必须使用自定义代码来构造它。
SQLite。大概可以离线创建数据库文件并将其添加到捆绑软件中。在首次执行该应用程序时,它将被复制到读/写存储,然后可以就地访问。
核心数据。我对Core Data不太熟悉,因为我们的团队无法使用它(因为我们的所有数据都必须加密)。但我知道它基于SQLite。但是我的理解是,与初次安装SQLite一样,必须在首次安装时“构建”数据库。
分析:
建议使用NSArray的建议不多。人们要么要么线性搜索它,要么安排它进行排序,然后使用“本地搜索”二进制搜索。没有性能优势,并添加了编写和中断代码。
使用NSDictionary将是高效的,并且如果定义或其他数据将与每个单词一起存储,则将是有意义的。但是,如果目的是仅测试单词的存在或不存在,则键/值对的“值”部分将不使用。
除了初始化它所需的轻微故障外,NSSet是表示仅需要测试“成员资格”(存在/不存在)的单词列表的最有效方法。这不是处理必须用单词存储其他数据的情况的好方法。
我不确定在使用Trie时是否有任何意义。平均而言,它在时间或空间上的效率并不比NSSet(或NSDictionary,如果需要“值”数据)效率要高得多,但要编写的代码更多,而要破解的代码更多。
(如果想进行“提示”,则使用trie确实有好处,如果键入单词的一部分,则会显示可能的“补全”列表,类似于Google所做的那样。trie是最自然的数据结构此特定功能。)
如果单词列表相当大(可能超过10K,当然如果超过100K),那么使用外部数据库(如SQLite)可能是最好的选择。查找的速度不如NSSet快,但是人们可能不会注意到其中的区别,一旦完成第一次处理,就无需在应用程序启动时进行特别的工作,并且单词列表在应用程序执行时不会占用RAM。一个人是否想要带有单词的附加数据几乎没有什么影响。 (为了确保速度,可能要确保在单词表的单词列上描述一个索引。)
就像我说的那样,我对Core Data不太熟悉,但是我知道它是建立在SQLite之上的。但是,我认为您不能像安装SQLite文件一样安装Core Data DB文件,因此将需要大量的首次处理。我也不确定Core Data是否允许您指定一个在word列上方的索引。
所以我说NSSet代表一个“小”列表,SQLite代表一个“大”列表。
关于ios - 将“词典”导入iOS游戏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23641325/