我正在创建一个iPhone应用程序。我有一个.plist文件,其中包含单词词典(大约180K)。
有一个textField用户开始输入单词。在他输入时,我使用委托方法textField:shouldChangeCharactersInRange:replacementString:
来确保他只输入abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ。
当用户第一次点击textField时,我加载一个名为finalWords
的NSMutableArray(在标题中声明,保留并合成)与.plist的内容(每个单词是一个NSString)。当用户输入一封信时,我会运行
-(void)filterWordsForString:(NSString *)string
{
NSRange *range;
for (int i=[finalWords count]-1 ; i >=0 ; i--)
{
range = [[finalWords objectAtIndex:i] rangeOfString:string];
if (range.location == NSNotFound)
{
[finalWords removeObjectAtIndex:i];
}
}
}
我的目标是在用户输入不属于真实单词的字符串时(根据我的字典)停止用户。这段代码的工作原理是它可以在用户输入时输入可能的单词。这样,一旦他输入一封字母使得它无法完成一个单词,我就不允许输入这封信。此外,一旦有一个独特的完成,我继续并用完成的单词填充textField。
问题在于,这一开始非常缓慢!第一个字母需要几秒钟,而第二个字母则需要几秒钟。到了第三,速度有点合理。有没有办法可以大大加快这个过滤过程?
感谢。
答案 0 :(得分:0)
您可以在应用程序加载时扫描.plist文件并创建字母哈希表(哈希是一种将数据压缩为单个值的方法,这样压缩您希望在同一个桶中的两个单词将产生相同的值),然后你可以使用它来查找前1-3个字母的正确桶,甚至在搜索之前。散列(与常规搜索相反)的好处在于,您实际上是在形成一个数据数组,其中生成的散列是存储桶的索引。因此,一旦数据被散列(这可能是一项昂贵的操作,但在加载时只进行一次),查找速度与查找数组中的数据一样快。
编辑(更详细说明):
如果要基于字母组合查找,可以基于重复的字母模式创建哈希表。假设创建一个基于'der'散列的存储桶,其中包含'spiderpig'和'binder',然后另一个目录将基于'spi'的散列,其中包含'spinach'和'spiderpig '同样(在这种情况下,spiderpig将在两个桶中)。如果正确实施,散列非常快,它是大多数搜索引擎背后的驱动力(这就是为什么你会看到它们在不到一秒的时间内返回数百万条结果)。