我有一个包含 500 个字符串 (NSString
) 的数组,每个字符串仅代表一个字符(例如:@"H"
),我将从开始循环到结束。
在这些字符串中,例如有诸如@"H"
、@"e"
、@"l"
、@“l”
,@“o”
。
它们肯定在数组中,但顺序未知。
我想从头到尾循环遍历数组并想打印出来
“你好”,没有重复。就一次。并且字符串 @"H"
必须首先出现在“ello”之前。
因此,当第一个 @"H"
出现时,我会开始寻找其余的“ello”并将其打印出来。
在过去的一个小时里我一直在思考这个问题,不幸的是,除了以下内容之外,我什么也没得到:
也许有一些条件,例如 NSPredicate 等,我可以在循环发生之前首先按顺序找到这些字符串的索引号。因此,我可以将它们打印出来,而无需在循环遍历数组时进行检查,从而利用一堆 if-else
。
例如:
NSArray *indexesThatMatchTheStrings = [......(condition => @"H", @"e", @"l", @"l", @"o").....]'
和indexesThatMatchTheStrings
将包含匹配的索引。如果不满足条件,那么我会事先知道我不必将它们打印出来。同样,“H”、“e”、“l”、“l”、“o”都在数组中,但顺序很重要。
集合中有这样的操作吗?我对任何类型的集合和算法都持开放态度(即 NSSet、NSArray、NSDictionary 等)。甚至是 C
中的方法(位移、结构、内存比较等)。有些东西又快又轻。
附录:
概括一下用例:
框架是否提供了任何方式或方法,可以让我们为数组、字典或集合等集合设置测试条件,以便我们可以根据一个特定的条件(在我的例子中:hello序列),以便我们可以最小化循环+比较开销?或者甚至完全避免循环+搜索,因为我们知道集合不满足搜索条件?
最佳答案
这是我的版本:
NSArray * allChars = @[@"l", @"A", @"B", @"H", @"b", @"e", @"H", @"c", @"c", @"l", @"b", @"q", @"l", @"l", @"l", @"z", @"o", @"H", @"e", @"l",@"l", @"o", @"l"];
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF in[cd] %@", @[@"H", @"e", @"l", @"o"]];
NSArray * equal = [allChars filteredArrayUsingPredicate:predicate];
NSString * sayHello = @"";
// This loop will find any sequence of Hello's characters
for (int i=0; i<equal.count; i++)
{
NSString * nextChar = equal[i];
NSString * try = [sayHello stringByAppendingString:nextChar];
if ([@"Hello" rangeOfString:try].location == 0) {
sayHello = try;
}
if ([sayHello rangeOfString:@"Hello"].location != NSNotFound) {
NSLog(@"Hello!");
break;
}
}
// This loop works if between Hello's char cannot be any other characters
sayHello = @"";
for (int i=0; i<equal.count; i++)
{
sayHello = [sayHello stringByAppendingString:equal[i]];
if ([sayHello rangeOfString:@"Hello"].location != NSNotFound) {
NSLog(@"Hello!");
break;
}
}
return YES;
编辑:感谢@melvas's编写正则表达式,我用 NSRegularExpression 做了同样的事情,并且没有循环:
NSString * possibleHello = [equal componentsJoinedByString:@""];
NSString * regex = @"(?=(h|H))(.*?)(?=(e|E))(.*?)(?<=(l|L))(.*?)(?=(l|L))(.*?)(?=(o|O))";
NSError * error = nil;
NSRegularExpression * regularExp = [NSRegularExpression regularExpressionWithPattern:regex
options:NSRegularExpressionDotMatchesLineSeparators
error:&error];
NSArray * matches = [regularExp matchesInString:possibleHello
options:NSMatchingReportProgress
range:NSMakeRange(0, posibleHello.length)];
if (matches.count) {
NSLog(@"Hello!");
}
关于ios - 集合枚举按顺序搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21837255/