- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有大量的字符串,我正在搜索这些字符串以查看给定的子字符串是否存在。似乎有两种合理的方法可以做到这一点。
选项 1:使用 NSString
方法 rangeOfSubstring
并测试是否.location
存在:
NSRange range = [string rangeOfSubstring:substring];
return (range.location != NSNotFound);
NSPredicate
语法
CONTAINS
:
NSPredicate *regex = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", substring];
return ([regex evaluateWithObject:string] == YES)
string
s。
最佳答案
您应该对使用 NSPredicate
的任何解决方案进行基准测试和计时。因为根据我的经验 NSPredicate
可能会很慢。
为简单起见,我会使用一个简单的 for(NSString *string in stringsArray) { }
循环类型。循环体将包含一个简单的 rangeOfSubstring
查看。您可以使用 CFStringFind()
将其性能提高几个百分点。 ,但只有在搜索大量字符串时才能看到好处。使用优势 CFStringFind()
是您可以避免(非常小的)Objective-C 消息调度开销。同样,当您搜索“很多”字符串时(对于一些总是变化的“很多”值),切换到它通常只是一个胜利,并且您应该始终进行基准测试以确保。更喜欢更简单的Objective-C rangeOfString:
如果可以的话。
一种更复杂的方法是将 ^Blocks 功能与 NSEnumerationConcurrent
一起使用。选项。 NSEnumerationConcurrent
只是一个提示,如果可能的话,您希望枚举同时发生,如果实现不能支持并发枚举,则可以自由地忽略此提示。但是,您的标准NSArray
最有可能实现并发枚举。实际上,这具有将 NSArray
中的所有对象分开的效果。并将它们拆分到可用的 CPU 上。您需要注意如何改变 ^Block 跨多个线程访问的状态和对象。这是一种潜在的方法:
// Be sure to #include <libkern/OSAtomic.h>
__block volatile OSSpinLock spinLock = OS_SPINLOCK_INIT;
__block NSMutableArray *matchesArray = [NSMutableArray array];
[stringsToSearchArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSRange matchedRange = [obj rangeOfString:@"this"];
if(matchedRange.location != NSNotFound) {
OSSpinLockLock((volatile OSSpinLock * volatile)&spinLock);
[matchesArray addObject:obj];
OSSpinLockUnlock((volatile OSSpinLock * volatile)&spinLock);
}
}];
// At this point, matchesArray will contain all the strings that had a match.
OSSpinLock
确保只有一个线程可以访问和更新
matchesArray
一次。您可以使用相同的
CFStringFind()
上面的建议也是如此。
rangeOfString:
本身不会匹配“单词边界”。在上面的例子中,我使用了词
this
,它将匹配字符串
A paleolithist walked in to the bar...
即使它不包含单词
this
.
NSRegularExpression
,目前仅适用于 >4.2 或 >4.3 iOS(我忘记了哪个)。 NSPredicate
, 通过 SELF MATCHES '(?w)\b...\b'
.这样做的好处是它不需要任何额外的东西(即 RegexKitLite),并且适用于所有(?)版本的 Mac OS X 和 iOS > 3.0。 NSPredicate
在 ICU 正则表达式中使用增强的断字功能。 :
NSString *searchForString = @"this";
NSString *regexString = [NSString stringWithFormat:@".*(?w:\\b\\Q%@\\E\\b).*", searchForString];
NSPredicate *wordBoundaryRegexPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexString];
NSArray *matchesArray = [stringsToSearchArray filteredArrayUsingPredicate:wordBoundaryRegexPredicate];
(?w:
使搜索不区分大小写在
regexString
与
(?wi:
.
.*(?w:...).*
说“匹配 (?w:...)
部分之前和之后的任何内容”(即,我们只对 (?w:...)
部分感兴趣)。 (?w:...)
说“在括号内打开 ICU 增强的分词/查找功能”。 \\b...\\b
(这实际上只是一个反斜杠,当它在 @""
字符串中时,任何反斜杠都必须被反斜杠转义)说“在单词边界处匹配”。 \\Q...\\E
说“将紧跟在 \Q
之后直到 \E
的文本视为文字文本(想想“引用”和“结束”)”。换句话说,“引用文字”中的任何字符都没有其特殊的正则表达式含义。 \Q...\E
的原因是您可能想要匹配
searchForString
中的文字字符.如果没有这个,
searchForString
将被视为正则表达式的一部分。例如,如果
searchForString
是
this?
,然后没有
\Q...\E
它会
不是 匹配文字字符串
this?
, 但要么
thi
或
this
,这可能不是您想要的。 :)
关于iphone - NSPredicate 与 NSString : Which is better/faster for finding superstrings?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195518/
Strassen 的算法在多项式上比 n 次方正则矩阵乘法快。 “多项式更快”是什么意思? 最佳答案 您的问题与“复杂性”的理论概念有关。例如,据说正则矩阵乘法的复杂度为 O(n^3)。这意味着随着维
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
假设我有两个 PHP 语句: echo "foo"."bar" echo "foo", "bar" 注意连接字符串的不同方式 - 使用 . 或 ,. 我意识到这两种方法之间的实际区别,使用 , 为关键
我有一个 RGB 图像,并尝试将 RGB 上的每个像素设置为黑色,其中相应的 alpha 像素也为黑色。所以基本上我试图将 Alpha“烘焙”到我的 RGB 中。我已经尝试使用 PIL 像素访问对象、
可能这个问题以前已经以许多不同的方式回答过很多次了。然而,我一直在寻找更具体的东西。通用词典,我相信比哈希表更快,因为它们不需要经历装箱/拆箱的过程。 但是,哈希表不是经过排序的,这意味着搜索可以更快
以这种方式加入给定的选择会更快吗 select ... join table1 on condition1 join table2 on condition2 然后这个 select ... join
我观看了演讲并阅读了博客文章,但我仍然不确定...这是为什么 template struct conditional { template using f = T; }; template<> str
我想知道用离散数据集编码的二维图形。对我来说,似乎由于计算机以离散集合运行,所以对图形做同样的事情也许更有意义。 例如,与其让一条线由两个 vector 表示,让计算机整理出像素配置,然后必须用代数方
我正在开发一个将大量数据写入磁盘的 C++ 程序。以下函数对数据进行 gzip 压缩并将其写入文件。压缩数据约为100GB。压缩并写出数据的函数如下: void constructSNVFastqD
我最近遇到了这段SQL: SELECT members.id FROM members, members_to_groups WHERE members.id = members_to_groups.
所以我一直在研究 pthreads,特别是尝试计算两个矩阵的乘积。我的代码非常困惑,因为它本应是我自己的一个快速有趣的小项目,但我使用的线程理论非常类似于: #include #include #
我看到了被选中的answer对此post . 我很惊讶 (x & 255) == (x % 256) 如果 x 是无符号整数,我想知道总是替换 % 是否有意义& in x % n for n = 2^
Anaconda是什么? Anaconda 是一个开源的 Python 发行版本,主要面向数据科学、机器学习和数据分析等领域。它不仅包含了 Python 解释器本身,更重要的是集成了大量的用于科学计
我正在使用Ubuntu 14.04操作系统的g2.8xlarge EC-2实例上启用cuDNN的情况下运行py-faster-rcnn。一切都已编译,似乎工作正常。我通过以下方式登录到远程实例: ss
要求用户输入的简单程序可以使用 datainputstream 或扫描仪。哪个会更快? Datainputstream 是二进制的,所以它可能更快?有意见吗?我只是很好奇,因为我正在构建一个程序,我希
我正在 INRIA Person 数据集上训练 Faster-RCNN(VGG-16 架构)。我接受了 180,000 个训练步骤的训练。但是当我评估网络时,它会用相同的图像给出不同的结果。以下是图片
我是 python 新手,我为 Hackerrank 问题提交了此代码 Arrays and Simple Queries ,但对于大量测试用例,程序“由于超时而终止”。我怎样才能提高效率? 我已将主
如果将程序分成头文件和源文件,如果提供给智能编译管理器,可能会受益于更快的编译,这就是我正在研究的内容。 理论工作的意愿:为每个源文件创建一个线程并一次将每个源文件编译成目标文件。然后将这些目标文件链
方法一: SELECT * FROM `wordpressusers` WHERE user_login='user10000001' PhpMyadmin 的结果: 方法2: SELECT user
据我所知set.add使用FastFloat的equals方法 对我来说重要的只是点后的前两位数(!!!),所以在 equals 方法中我使用 Math.abs() >= 0.001 来使 equal
我是一名优秀的程序员,十分优秀!