1

我有一个应用程序(Cocoa Touch、Web 浏览器),但是我需要能够将 NSString 与数千个其他字符串进行比较。这是交易。

当 WebView 加载时,我得到了 URL。我需要将此 URL 与数以千计的结果 (27,847) 进行比较。这些数字中的每一个都代表纯文本文件中的一行文本。

我想知道从文本文件中获取数据并将其与 NSString 进行比较的最佳方法。我需要知道 WebView 正在加载的 URL 是否包含这些字符串。

该应用程序需要非常快,所以我不能只解析文本文件中的每一行,将其转换为数组,然后比较每个结果。

请分享你的想法。谢谢。

4

5 回答 5

2

我认为最干净的解决方案是:

  • 创建一个可以将工作卸载到服务器并返回响应的 Web 服务。由于听起来您正在构建 Web 保护服务,因此随着时间的推移,您的数据库可能会变得非常庞大,您可以扩展您的服务器以提高其速度。此外,您不希望每次查找数据更改时都更新您的应用程序。

其他选项包括:

  • 使用本地 SQLite 数据库。SQL 数据库应该相对较快地执行查找。

  • 如果您不想使用任何数据库,您是否尝试过将所有搜索字符串放入 NSDictionary 或 NSMutableDictionary 对象?这样,您只需检查要搜索的字符串的 valueForKey: 是否为 nil。

示例代码:

NSDictionary *searchDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [NSNumber numberWithBool:YES], @"google.com",
                                  [NSNumber numberWithBool:YES], @"yahoo.com",
                                  [NSNumber numberWithBool:YES], @"bing.com",
                                  nil];

NSString *searchString = @"bing.com";

if ([searchDictionary valueForKey:searchString]) {
    // search string found
} else {
    // search string not found
}

注意:如果您希望 NSDictionary 执行不区分大小写的比较,请预先加载所有值小写,并在使用 valueForKey: 时将搜索字符串设为小写。

这可能需要多少内存是另一回事,但我看不出这种比较如何在本地更快地进行。不过,我强烈推荐删除 Web 服务方法。

于 2012-12-12T16:22:08.933 回答
1

从文件中创建一个字符串并枚举这些行。

NSString *stringToCheck;

NSData *bytesOfFile = [NSData dataWithContentsOfFile:@"/path/myfile.txt"];
NSString *fileString = [[NSString alloc] initWithData:bytesOfFile
                                              encoding:NSUTF8Encoding];
__block BOOL foundMatch = NO;

[fileString enumerateLinesUsingBlock:^(NSString *line, BOOL *stop){
    if([stringToCheck isEqualToString:line]){
        *stop = YES;
        foundMatch = YES;
    }
}];
于 2012-12-12T16:44:52.913 回答
1

这是正则表达式的工作。获取您要查找/过滤的所有子字符串,对它们进行适当的转义(转义字符,如[, ], |, and\等,使用\),然后使用|. 结果字符串是您的正则表达式,您将其应用于每个 URL。

可以循环遍历一个充满子字符串的整个数组,rangeOfString:options:对每个子字符串进行处理,但这是一种缓慢的方式。为这种事情构建了一个好的正则表达式实现,我希望Apple的实现是合适的。

就是说,把它弄清楚。我已经看到一些正则表达式的实现让|操作员窒息,所以你要确保 Apple 不是其中之一。

于 2012-12-13T07:28:27.067 回答
0

如果您需要比较文本文件中的每个字符串,您将不得不比较它,无法绕过它。

但是,您可以做的是在后台线程上执行此操作,同时显示一些加载或其他内容,并且不会感觉应用程序卡住了。

于 2012-12-12T16:22:18.147 回答
0

我建议你NSDictionary先试试。您可以将所有 URL 加载到其中,并且在内部它将使用某种哈希表/映射进行非常快速 (O(1)) 的查找。

然后,您可以检查 的结果[dictionary objectForKey:userURL],如果它返回某些内容,则该 URL 与字典中的一个匹配。

唯一的问题是它需要精确的字符串匹配。如果您的字典包含http://server/foobar并且用户输入http://server/FOOBAR(因为它是不区分大小写的服务器),那么您将错过查找。同样,将?foobar查询添加到 URL 的末尾也会导致未命中。server:80您还可以使用和字符编码添加显式端口,%XX您可以创建相同 URL 的数百个变体。您必须考虑到这一点并规范化字典中的 URL 以及用户在查找之前输入的 URL。

于 2012-12-12T16:34:21.583 回答