【问题标题】:How to print the reverse of NSString in objective c without using componentsSeparatedByString method?如何在不使用 componentsSeparatedByString 方法的情况下在目标 c 中打印 NSString 的反向?
【发布时间】:2013-05-09 10:23:36
【问题描述】:

我想创建一个提供字符串反转的方法。假设我在方法中传递了一个 NSString“Welcome to Objective C”,并且该方法返回一个反转字符串,如“C Objective to Welcome”而不是“C evitcejbO ot emocleW”不使用 componentsSeparatedByString 方法。 有可能与Objective c ..有关吗? 请帮忙。

【问题讨论】:

  • @AdamM 这特别是 OP 不想做的事情。
  • @OP: "没有使用 componentsSeparatedByString 方法" - 为什么?
  • 有人问我这个问题.. 打印一个没有 componentsSeparatedByString 方法的反向字符串..
  • 听起来像是一个家庭作业,也许你应该在 SO 中提问之前尝试下一些努力...
  • 如果所有其他方法都失败了,编写代码来逐个遍历字符串一个字符,识别断词,然后按照你想要的方式重新组合。是的,您可以使用其他技巧,但可能不会更有效。

标签: objective-c nsstring


【解决方案1】:

你可以逐字枚举字符串。

NSString *string = @"Welcome to Objective-C!";

NSMutableArray *words = [NSMutableArray array];

[string enumerateLinguisticTagsInRange:NSMakeRange(0, [string length])
                                scheme:NSLinguisticTagSchemeTokenType
                               options:0
                           orthography:nil
                            usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                                [array addObject:[string substringWithRange:tokenRange]];
                            }];

NSMutableString *reverseString = [[NSMutableString alloc] init];

for (NSString *word in [words reverseObjectEnumerator]){
    [reverse appendString:word];
}

NSLog(@"%@", reverseString);

这将打印...

"!C-Objective to Welcome"

您可以更改选项以省略空格和其他内容...

【讨论】:

  • 不客气。这个功能其实很强大。您可以使用此功能查找单词的类型、词源、动词、名词、形容词等。也是一种编辑属性字符串以添加突出显示等的非常快速的方法......
  • 我们能不能用一些更简单的方式来做......?
  • 并非如此。还有其他方法可以逐个字符解析以找出单词的开始和结束位置,然后将它们存储在数组中。但基本上你正在做这个函数所做的事情。这是迄今为止最简单、最快捷的方式,无需使用 componentSeparatedByString。
  • 实际上一个面试官让我打印一个反向的 NSString "Welcome to Objective-C!"在不使用 componentSeparatedByString 方法的情况下“欢迎 C-Objective”..但我是通过 componentSeparatedByString 方法完成的
  • 不,这是一个完全不同的功能。 componentsSeparatedByString 将在某些语言中中断。例如,日语不使用空格作为单词分隔符,因此 componentSeparatedByString:@" " 不起作用。本质上,是的,您正在做同样的事情。但是,用于反转字符串字序的任何函数也是如此。此外,cSBS 不会看到标点符号,即。 Objetcive-C 仍然是 Objective-C 而不是 C-Objective。
【解决方案2】:

我使用下面的方法在 iOS 中反转字符串

- (NSString *)reverseString:(NSString *)stringToReverse
{
    NSMutableString *reversedString = [NSMutableString stringWithCapacity:[stringToReverse length]];
    [stringToReverse enumerateSubstringsInRange:NSMakeRange(0, [stringToReverse length])
                                        options:(NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences)
                                     usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
            [reversedString appendString:substring];
    }];
    return reversedString;
}

【讨论】:

    【解决方案3】:

    抱歉,我之前误读了您的问题。我使用了一系列循环来做到这一点,我的答案比 Fogmeister 更混乱,但我想试一试,看看我能不能做到。

    NSString *str = @"This is a test";
    
    
        NSMutableArray *array = [[NSMutableArray alloc] init];
    
        for(int i = 0; i < [str length]; i++)
        {
            char sTest = [str characterAtIndex:i];
            if(sTest == ' ')
            {
                [array addObject:[NSNumber numberWithInt:i]];
            }
        }
    
        NSInteger iNext = [[array objectAtIndex:[array count]-1] integerValue];
        iNext+=1;
    
        if(iNext < [str length])
        {
           [array addObject:[NSNumber numberWithInt:iNext]]; 
        }
    
        NSMutableArray *wordArray = [[NSMutableArray alloc] init];
    
        for(int i = 0; i < [array count]; i++)
        {
            if (i == 0)
            {
                int num = [[array objectAtIndex:i] integerValue];
                NSString *s = [[str substringFromIndex:0] substringToIndex:num];
                [wordArray addObject:s];
    
            }
            else if(i == [array count]-1)
            {
                int prev = [[array objectAtIndex:i-1] integerValue]+1;
                int num =  [str length];
                NSString *s = [[str substringToIndex:num] substringFromIndex:prev];
                [wordArray addObject:s];
            }
            else
            {
                int prev = [[array objectAtIndex:i-1] integerValue]+1;
                int num = [[array objectAtIndex:i] integerValue];
    
                NSString *s = [[str substringToIndex:num] substringFromIndex:prev];
                [wordArray addObject:s];
            }
        }
    
        NSMutableArray *reverseArray = [[NSMutableArray alloc]init];
        for(int i = [wordArray count]-1; i >= 0; i--)
        {
    
            [reverseArray addObject:[wordArray objectAtIndex:i]];
        }
        NSLog(@"%@", reverseArray);
    

    【讨论】:

    • 好主意..好主意
    【解决方案4】:

    在这里,我已经用最少的循环次数替换了字符。日志(n/2)。

    NSString  *string=@"Happy World";
    NSInteger lenth=[string length];
    NSInteger halfLength=[string length]/2;
    
    for(int i=0;i<halfLength;i++)
    {
       NSString *leftString=[NSString stringWithFormat:@"%c",[string characterAtIndex:i]];
       NSString *rightString=[NSString stringWithFormat:@"%c",[string characterAtIndex:(lenth-i-1)]];
    
       string= [string stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:rightString];
       string=[string stringByReplacingCharactersInRange:NSMakeRange((lenth-i-1), 1) withString:leftString];
    
    }
    
    NSLog(@"%@",string);
    

    【讨论】:

      【解决方案5】:

      试试这个,效果如你所愿,

      调用函数:-

       [self reversedString:@"iOS"];
      

      反转字符串函数:-

       -(void)reversedString :(NSString *)reversStr
      
       {    // reversStr is "iOS"
      
           NSMutableString *reversedString = [NSMutableString string];
           NSInteger charIndex = [reversStr length];
           while (charIndex > 0) {
           charIndex--;
           NSRange subStrRange = NSMakeRange(charIndex, 1);
          [reversedString appendString:[reversStr substringWithRange:subStrRange]];
        }
         NSLog(@"%@", reversedString); // outputs "SOi"
       }
      

      希望这对某些人有帮助。

      【讨论】:

        【解决方案6】:

        没有 API 可以做到这一点,如果那是你的要求。

        您始终可以遍历字符串以查找空格(或标点符号,这取决于您的需要),识别单词并手动重新编写“反转”消息。

        【讨论】:

        • 在 NSString 上有一个内置方法可以通过标签进行枚举。看我的回答。
        • 不错的解决方法 :) 实际上我的意思是“没有 api 可以自动反转字符串中单词的顺序”
        • 啊,我明白了 :D 我喜欢这个功能 :D 对于进行自然语言解析非常有用。
        猜你喜欢
        • 2017-03-01
        • 2021-12-09
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多