ios - 集合枚举按顺序搜索字符串

标签 ios objective-c c collections nspredicate

我有一个包含 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/

相关文章:

objective-c - MsgPack 无法消息打包 NSData 对象

ios - swift ,线程 1 : EXC_BAD_INSTRUCTION error

c - 将 void * 值设置为 intptr_t 变量是否需要显式转换?

ios - 位置变化时极地到笛卡尔的转换

ios - Font Awesome 图标不适用于 UIButton IBOutlet

ios - UIGestureRecognizer 只为 subView 添加,但它也适用于 parentView?

c - int 指针数组中的指针地址

c - 如何连接字符串以生成固定宽度的输出

ios - UITableView objective-C 中的不同 UICollectionViews

ios - 循环遍历字符串数组(迭代图像)