Ios 从目标c中的nsstring中获取最后一个空格

Ios 从目标c中的nsstring中获取最后一个空格,ios,objective-c,algorithm,Ios,Objective C,Algorithm,我有一个很大的字符串集,比如-Objective-C是为OSX和iOS编写软件时使用的主要编程语言。它是C编程语言的超集,提供面向对象的功能和动态运行时。Objective-C继承了C的语法、基元类型和流控制语句,并添加了用于定义类和方法的语法。它还为对象图管理和对象文本添加了语言级别的支持,同时提供了动态键入和绑定,将许多职责推迟到运行时。 我想把上面的字符串分成至少15个字符的字符串,字符串以空格结尾并存储在数组中。为此,我应用了以下逻辑,这是工作良好,但它将繁忙的情况下,长字符串,如100

我有一个很大的字符串集,比如-Objective-C是为OSX和iOS编写软件时使用的主要编程语言。它是C编程语言的超集,提供面向对象的功能和动态运行时。Objective-C继承了C的语法、基元类型和流控制语句,并添加了用于定义类和方法的语法。它还为对象图管理和对象文本添加了语言级别的支持,同时提供了动态键入和绑定,将许多职责推迟到运行时。
我想把上面的字符串分成至少15个字符的字符串,字符串以空格结尾并存储在数组中。为此,我应用了以下逻辑,这是工作良好,但它将繁忙的情况下,长字符串,如1000000个字符的编译器,请帮助我,如果你能建议更好的方式来满足要求。谢谢

NSMutableArray *randomSelection = [[NSMutableArray alloc] init];
NSString *shortDescription = shortDesc_;
NSString *str=@"";
NSArray *iarray=[shortDescription componentsSeparatedByString:@" "];
NSInteger i=0;
while (i<iarray.count)
{
    NSString *prevStr=str;
    str=[prevStr stringByAppendingString:[[iarray objectAtIndex:i] stringByAppendingString:@" "]];

    if(str.length>15)
    {
        [randomSelection addObject:prevStr];
        str=[[iarray objectAtIndex:i] stringByAppendingString:@" "];
    }

    i++;
}
if(str.length>0)
    [randomSelection addObject:str];
NSMutableArray*randomSelection=[[NSMutableArray alloc]init];
NSString*shortDescription=shortDesc;
NSString*str=@;
NSArray*iarray=[shortDescription组件由字符串分隔:@”“];
NSInteger i=0;
while(i15)
{
[随机选择添加对象:prevStr];
str=[[iarray objectAtIndex:i]stringByAppendingString:@'';
}
i++;
}
如果(str.length>0)
[随机选择对象:str];

让我们考虑一下您的算法,因为您正确地声明了工作。

首先将一百万个字符拆分为“单词”,此时内存中还有一百万个字符,然后将这些单词合并成15个或更多字符的字符串,这将占用大约一百万个字符的内存。也许你可以通过在正确的点上直接分解输入来消除对中间百万的需求?这将使您的内存需求减少大约1/3,并节省大量的拷贝

接下来,在构建包含15个左右字符的字符串时,重复调用
length
,以计算新扩展字符串的长度。但是,您知道它有多长-之前的长度+添加单词的长度+空格的1。也许记录长度可以节省宝贵的时间

但是如果你在正确的地方断了线,你就根本不需要记录长度,但是这是可能的吗

考虑以下方法:

  • rangeOfCharacterFromSet:options:range
    rangeOfString:options:range
    ;及
  • substringWithRange:
  • 前两个字符中的一个可以很容易地找到组成下一个15个左右字符串的字符范围,最后一个可以让您提取它。内存中没有大约一百万个字符,不需要不断检查长度

    会更快吗?去试试看

    试试这个

    int numberOfLetters = 15;
    
    if ([text length]>numberOfLetters) {
    
        NSMutableArray* strings = [[NSMutableArray alloc] init];
       __block int checkedStringLenght = 0;
    
        while (checkedStringLenght<text.length-1) {
    
            int rest = (int)text.length - checkedStringLenght;
            __block NSRange neededRange;
    
            [text enumerateSubstringsInRange:NSMakeRange(checkedStringLenght, MIN(rest,numberOfLetters)) options:NSStringEnumerationByWords | NSStringEnumerationReverse usingBlock:^(NSString *substring, NSRange subrange, NSRange enclosingRange, BOOL *stop) {
                unsigned long fin =subrange.location - checkedStringLenght-1;
                if (fin == 0){
    
                    NSString* lastString = [text substringWithRange:NSMakeRange(checkedStringLenght, rest)];
    
                    if ([[strings lastObject] length] + rest <= numberOfLetters) {
                        [strings replaceObjectAtIndex:strings.count-1 withObject:[strings[strings.count-1] stringByAppendingString:lastString]];
                    } else [strings addObject:lastString];
                    checkedStringLenght+=rest;
                }
                else {
                    neededRange =NSMakeRange(checkedStringLenght, fin);
                    NSString *ch = [text substringWithRange:neededRange];
                    checkedStringLenght+=ch.length;
                    [strings addObject:ch];
                }
                *stop = YES;
            }];
    
    
        }
    
    
        NSLog(@"%@",strings);
    }
    
    int numberOfLetters=15;
    如果([文本长度]>字母数){
    NSMUTABLEARRY*字符串=[[NSMUTABLEARRY alloc]init];
    __块int checkedStringLength=0;
    
    while(checkedstringlength在if(str.length>15)中使用continue条件可能有助于中断迭代!我不确定stillHi@CRD,我使用的是您解释的方法,但在这种情况下,我面临的问题是-假设您在这种情况下获得15个字符范围的字符串,有时会出现,部分单词位于15范围内,其余部分保留,以便获得完整的单词在每个插槽中,我需要应用更多的限制。例如,在word中-@“编程语言”15个字符将是@“编程lan”,我不需要。我需要在每个插槽中使用适当的单词。@user3185320-使用前两种方法之一开始搜索(白色)通过在适当的范围内传递空格。例如,要查找从偏移量N开始的15或更大的字符串,您需要传递一个起始位置为N+15的范围。这样,您可以在每个插槽中获得适当的“字”。