首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >反转NSString文本

反转NSString文本
EN

Stack Overflow用户
提问于 2011-07-17 04:56:06
回答 14查看 44.6K关注 0票数 51

我已经在谷歌上搜索了很多关于如何做到这一点的信息,但是我如何才能逆转一个NSString呢?例如:hi会变成: ih

我正在寻找最简单的方法来做到这一点。

谢谢!

@Vince我做了这样的方法:

代码语言:javascript
复制
- (IBAction)doneKeyboard {

// first retrieve the text of textField1
NSString *myString = field1.text;
NSMutableString *reversedString = [NSMutableString string];
NSUInteger charIndex = 0;
while(myString && charIndex < [myString length]) {
    NSRange subStrRange = NSMakeRange(charIndex, 1);
    [reversedString appendString:[myString substringWithRange:subStrRange]];
    charIndex++;
}
// reversedString is reversed, or empty if myString was nil
field2.text = reversedString;
}

我将该方法与textfield1的didendonexit关联起来。当我单击done按钮时,它不会反转文本,UILabel只显示我输入的UITextField的文本。怎么啦?

EN

回答 14

Stack Overflow用户

发布于 2011-07-18 16:28:35

数据块版本。

代码语言:javascript
复制
NSString *myString = @"abcdefghijklmnopqrstuvwxyz";
NSMutableString *reversedString = [NSMutableString stringWithCapacity:[myString length]];

[myString enumerateSubstringsInRange:NSMakeRange(0,[myString length]) 
                             options:(NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences)
                          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                            [reversedString appendString:substring];
                        }];

// reversedString is now zyxwvutsrqponmlkjihgfedcba
票数 104
EN

Stack Overflow用户

发布于 2014-04-16 15:02:38

对任何对象使用方法: NSString、NSNumber等:

代码语言:javascript
复制
NSLog(@"%@",[self reverseObject:@12345]);
NSLog(@"%@",[self reverseObject:@"Hello World"]);

方法:

代码语言:javascript
复制
-(NSString*)reverseObject:(id)string{

string = [NSString stringWithFormat:@"%@",string];
NSMutableString *endString = [NSMutableString new];

while ([string length]!=[endString length]) {
    NSRange range = NSMakeRange([string length]-[endString length]-1, 1);
    [endString appendString: [string substringWithRange:range]];
}
return endString;}

日志:

代码语言:javascript
复制
2014-04-16 11:20:25.312 TEST[23733:60b] 54321
2014-04-16 11:20:25.313 TEST[23733:60b] dlroW olleH
票数 3
EN

Stack Overflow用户

发布于 2011-07-19 02:03:27

如果只迭代字符串的一半,交换两端的字符,会不会更快?因此,对于一个5个字符的字符串,您可以交换字符1+ 5,然后2+4和3不需要与任何字符交换。

代码语言:javascript
复制
NSMutableString *reversed = [original mutableCopyWithZone:NULL];
NSUInteger i, length;

length = [reversed length];

for (i = 0; i < length / 2; i++) {
    // Store the first character as we're going to replace with the character at the end
    // in the example, it would store 'h' 
    unichar startChar = [reversed characterAtIndex:i];

    // Only make the end range once
    NSRange endRange = NSMakeRange(length - i, 1);

    // Replace the first character ('h') with the last character ('i')
    // so reversed now contains "ii"
    [reversed replaceCharactersInRange:NSMakeRange(i, 1) 
                            withString:[reversed subStringWithRange:endRange];

    // Replace the last character ('i') with the stored first character ('h)
    // so reversed now contains "ih"
    [reversed replaceCharactersInRange:endRange
                            withString:[NSString stringWithFormat:@"%c", startChar]];
}

编辑

做了一些测试后,答案是否定的,它比循环遍历所有东西的版本慢6倍。让我们慢下来的是为replaceCharactersInRange: NSStrings方法创建临时字符串。这里有一种方法,通过直接操作字符数据只创建一个NSString,在简单的测试中似乎要快得多。

代码语言:javascript
复制
NSUInteger length = [string length];
unichar *data = malloc(sizeof (unichar) * length);
int i;

for (i = 0; i < length / 2; i++) {
    unichar startChar = [string characterAtIndex:i];
    unichar endChar = [string  characterAtIndex:(length - 1) - i];

    data[i] = endChar;
    data[(length - 1) - i] = startChar;
}

NSString *reversed = [NSString stringWithCharacters:data length:length];
free(data);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6720191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档