2011-12-28 18 views
-1

文字列を逆にするコードを書いています。私は、次のコードを実行すると、エラーがスローされます。iOSで文字列を反転する

- (NSString*) reversingName:(NSString *)myNameText 
{ 
    NSString *result; 
    int len = [myNameText length]; 
    NSMutableString *reverseName = [[NSMutableString alloc] initWithCapacity:len]; 
    for(int i=len;i>0;i--) 
    { 
    [reverseName appendFormat:[NSString stringWithFormat:@"%c",[myNameText characterAtIndex:i]]]; 
    } 
    result = reverseName; 
    return result; 
} 
+2

エラーは何ですか? –

答えて

1

このサンプルコードを試すべきです:

NSString *name = @"abcdefghi" ; 
    int len = [name length]; 
    NSMutableString *reverseName = [[NSMutableString alloc] initWithCapacity:len]; 

    for(int i=len-1;i>=0;i--) 
    { 
     [reverseName appendFormat:[NSString stringWithFormat:@"%c",[name characterAtIndex:i]]]; 

    } 

    NSLog(@"%@",reverseName); 
+1

'[reverseName appendFormat:@"%c "、[name characterAtIndex:i]]'はすでに十分です。 – Byte

9

次のようにforループラインは次のようになります。

for(int i=len-1;i>=0;i--) 

だからあなたの方法は

- (NSString*) reversingName:(NSString *)myNameText 
{ 
    int len = [myNameText length]; 
    NSMutableString *reverseName = [[NSMutableString alloc] initWithCapacity:len]; 
    for(int i=len-1;i>=0;i--) 
    { 
     [reverseName appendString:[NSString stringWithFormat:@"%c",[myNameText characterAtIndex:i]]]; 
    } 
    return [reverseName autorelease]; 
} 
9

私はそこに誰もが興味を持っていた場合の別のバージョンを投げるだろうと思って...個人的に、私はNSMutableStringを使用してクリーンなアプローチを好むが、パフォーマンスが最優先である場合には、この1の方が高速です:

- (NSString *)reverseString:(NSString *)input { 
    NSUInteger len = [input length]; 
    unichar *buffer = malloc(len * sizeof(unichar)); 
    if (buffer == nil) return nil; // error! 
    [input getCharacters:buffer]; 

    // reverse string; only need to loop through first half 
    for (NSUInteger stPos=0, endPos=len-1; stPos < len/2; stPos++, endPos--) { 
     unichar temp = buffer[stPos]; 
     buffer[stPos] = buffer[endPos]; 
     buffer[endPos] = temp; 
    } 

    return [[NSString alloc] initWithCharactersNoCopy:buffer length:len freeWhenDone:YES]; 
} 

私も迅速に書きました試験ならびに(Iはまた、以下を含む)より伝統的なNSMutableString方法とこれを比較する:

// test reversing a really large string 
NSMutableString *string = [NSMutableString new]; 
for (int i = 0; i < 10000000; i++) { 
    int digit = i % 10; 
    [string appendFormat:@"%d", digit]; 
} 
NSTimeInterval startTime = [[NSDate date] timeIntervalSince1970]; 
NSString *reverse = [self reverseString:string]; 
NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSince1970] - startTime; 
NSLog(@"reversed in %f secs", elapsedTime); 

結果は以下の通りであった:

  • NSMutableString法(下記)を用い - *バッファ法(上記)のunichar使用

  • "3.720631秒で逆" - "0.032604秒で逆"

は単なる参考のために、ここで使用されるNSMutableString方法です

- (NSString *)reverseString:(NSString *)input { 
    NSUInteger len = [input length]; 
    NSMutableString *result = [[NSMutableString alloc] initWithCapacity:len]; 
    for (int i = len - 1; i >= 0; i--) { 
     [result appendFormat:@"%c", [input characterAtIndex:i]]; 
    } 
    return result; 
} 

(注:この比較のために、私は誰も私のためにこの回答に投票することができれば、私は感謝して投票したり回答にコメントするにはまだ十分な評判ポイントを持っていません。私は長い時間のリーダーしてきたが、今はより多くの貢献を開始したい)

+0

XOR演算を使ってmakeを高速化することもできます(毎回一時変数を割り当てる代わりに) – Xiangdong

1

はスウィフト2.0で文字列をリバース:!

let string = "This is a test string." 
let characters = string.characters 
let reversedCharacters = characters.reverse() 
let reversedString = String(reversedCharacters) 

短い方法:

String("This is a test string.".characters.reverse()) 

OR

let string = "This is a test string." 
let array = Array(string) 
let reversedArray = array.reverse() 
let reversedString = String(reversedArray) 

短い方法:

String(Array("This is a test string.").reverse())