检查NSString是否包含iPhone上的通用名字

检查NSString是否包含iPhone上的通用名字,iphone,cocoa,core-data,nsstring,Iphone,Cocoa,Core Data,Nsstring,我想知道最好的方法是什么来检查iPhone应用程序的NSString中是否包含一个普通的名字。我有一个大约5500个普通美国名字的排序文本文件,用新行分隔。我在其中搜索的名称字符串不是很长,很可能是普通句子的大小 我最初的计划是将排序后的列表加载到内存中,然后迭代NSString中的每个单词,对列表执行二进制搜索,以确定该单词是否为常用名称 我是否最好尝试将此名称列表放入CoreData或SQLite表中,并使用它执行查询?我的理解是,如果我走了那条路,我就不必将整个列表载入内存 我猜这种情况是

我想知道最好的方法是什么来检查iPhone应用程序的NSString中是否包含一个普通的名字。我有一个大约5500个普通美国名字的排序文本文件,用新行分隔。我在其中搜索的名称字符串不是很长,很可能是普通句子的大小

我最初的计划是将排序后的列表加载到内存中,然后迭代NSString中的每个单词,对列表执行二进制搜索,以确定该单词是否为常用名称

我是否最好尝试将此名称列表放入CoreData或SQLite表中,并使用它执行查询?我的理解是,如果我走了那条路,我就不必将整个列表载入内存


我猜这种情况是用于文字游戏的单词词典的常见问题,所以我只是想知道快速查找的最佳实践是什么。谢谢

SQLite在查找速度和最大限度地减少内存使用方面都非常适合这种情况。如果需要的话,它还可能通过互联网更新名字列表


在这种情况下,使用核心数据(实际上是围绕SQLite的elabourate包装器)会有点过分,尤其是当您不需要ORM之类的功能时。

SQLite在查找速度和最大限度地减少内存使用方面都非常适合。如果需要的话,它还可能通过互联网更新名字列表


在这种情况下,使用核心数据(实际上是围绕SQLite的elabourate包装器)会有点过分,特别是当您不需要类似ORM的功能时。另一个问题是,NSSET具有恒定的查找时间,即O(1)

将您的姓名逐个加载到NSMutableSet中。这将是最慢的部分,但只需要做一次。如果您的文件是一个简单的以行分隔的名称文件,那么使用标准C库读取该文件可能会更容易,因为Cocoa不支持逐行输入

之后,只需使用
[nameSet containsObject:name]
检查它是否在列表中

这种方法有几个缺点:

  • 要测试的名称必须与集合中的名称大小写相同,即“paul”和“paul”是不同的字符串。您可以通过在将所有名称插入集合之前将其转换为小写,然后在对照集合进行检查之前将要检查的名称转换为小写来规避此问题
  • 用已经被接受的答案可能更容易

  • NSSet也可能有用。另一个问题是,NSSET具有恒定的查找时间,即O(1)

    将您的姓名逐个加载到NSMutableSet中。这将是最慢的部分,但只需要做一次。如果您的文件是一个简单的以行分隔的名称文件,那么使用标准C库读取该文件可能会更容易,因为Cocoa不支持逐行输入

    之后,只需使用
    [nameSet containsObject:name]
    检查它是否在列表中

    这种方法有几个缺点:

  • 要测试的名称必须与集合中的名称大小写相同,即“paul”和“paul”是不同的字符串。您可以通过在将所有名称插入集合之前将其转换为小写,然后在对照集合进行检查之前将要检查的名称转换为小写来规避此问题
  • 用已经被接受的答案可能更容易

  • 这种方法对我来说似乎更简单,但我认为我使用SQLite只是为了不需要预先将所有内容加载到内存中——尽管只有5500个条目可能不是问题。@Joe:是的,当您只需在一列表中查找内容,就可以享受SQL解析器的开销时,究竟为什么要使用框架提供的数据结构来实现快速查找呢。这种方法对我来说似乎更简单,但我认为我使用SQLite只是为了不需要预先将所有内容加载到内存中——尽管只有5500个条目可能不是问题。@Joe:是的,当您只需在一列表中查找内容,就可以享受SQL解析器的开销时,究竟为什么要使用框架提供的数据结构来实现快速查找呢。你能澄清一下你所说的
    是什么意思吗?检查一个NSString中是否包含一个普通的名字。这是指一个名为John的用户输入了。
    ,还是指
    John
    ?换句话说,您正在检查的字符串是否只包含名称,或者名称是否必须在除了名称之外还包含“其他内容”的字符串中找到?这会对所选择的方法产生影响。此外,您需要以“多快”的速度完成此操作?必须在包含名称之外的“其他内容”的字符串中找到名称。字符串不长,一个标准句子可能有50-100个字符。我希望它尽快完成,但我意识到这是内存的折衷。好吧,如果速度是一个问题,我可能会在运行中构建一个约5500个名称的DFA。如果需要,可以将DFA序列化到非易失性存储。DFA必须支持Unicode,为了方便起见,可能会使用UTF8。然后我可能会使用
    CFStringGetCStringPtr
    /
    CFStringGetBytes
    获取字符串的UTF8副本,并在其上运行DFA。性能将是~
    O(n)
    ,其中
    n
    是要搜索的字符串的大小。您能否澄清一下
    的意思?检查NSString中是否包含一个通用的名字
    。这是指一个名为John的用户输入了。,还是指
    John
    ?我