51 votes

Inverser le texte NSString

J'ai beaucoup cherché sur Google comment faire, mais comment inverser une NSString ? Ex : hi deviendrait : ih

Je cherche le moyen le plus simple de le faire.

Merci !

@Vince j'ai fait cette méthode :

- (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;
}

J'ai relié cette méthode au didendonexit de textfield1. Lorsque je clique sur le bouton "done", le texte n'est pas inversé, l'UILabel affiche simplement le texte du UITextField que j'ai saisi. Quel est le problème ?

2voto

A.G Points 9897

Swift 2.0 :

1) let str = "Bonjour, monde !" let reversed = String(str.characters.reverse()) print(inversé)

En bref :

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

2)

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

Le chemin le plus court :

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

OU

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

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

Testé sur le terrain de jeu :

import Cocoa

//Assigning a value to a String variable
var str = "Hello, playground"

//Create empty character Array.
var strArray:Character[] = Character[]()

//Loop through each character in the String
for character in str {
//Insert the character in the Array variable.
strArray.append(character)
}

//Create a empty string
var reversedStr:String = ""

//Read the array from backwards to get the characters
for var index = strArray.count - 1; index >= 0;--index {
//Concatenate character to String.
reversedStr += strArray[index]
}

La version courte :

var str = “Hello, playground”
var reverseStr = “”
for character in str {
reverseStr = character + reverseStr
}

2voto

iain Points 3778

Serait-il plus rapide de n'itérer que sur la moitié de la chaîne en échangeant les caractères à chaque extrémité ? Ainsi, pour une chaîne de 5 caractères, on échange les caractères 1 + 5, puis 2 + 4 et 3 n'a pas besoin d'être échangé avec quoi que ce soit.

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]];
}

modifier ----

Après avoir effectué quelques tests, la réponse est non, elle est environ 6 fois plus lente que la version qui boucle sur tout. La chose qui nous ralentit est la création des NSStrings temporaires pour la méthode replaceCharactersInRange:withString. Voici une méthode qui crée une seule NSString en manipulant directement les données des caractères et qui semble beaucoup plus rapide dans les tests simples.

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);

1voto

Paul Delivett Points 51

Aucune des réponses ne semble prendre en compte les caractères multi-octets, voici donc mon exemple de code. Il suppose que vous ne passez jamais dans une chaîne de plus d'un caractère.

- (void)testReverseString:(NSString *)string
{
    NSMutableString *rString = [NSMutableString new];
    NSInteger extractChar = [string length] - 1;
    while (extractChar >= 0)
    {
        NSRange oneCharPos = [string rangeOfComposedCharacterSequenceAtIndex:extractChar];
        for (NSUInteger add = 0; add < oneCharPos.length; ++ add)
        {
            unichar oneChar = [string characterAtIndex:oneCharPos.location + add];
            [rString appendFormat:@"%C", oneChar];
        }
        extractChar -= oneCharPos.length;
    }

    NSLog(@"%@ becomes %@", string, encryptedString );
}

1voto

Stephane Points 62
  • NSString en char utf32 (toujours 32 bits (unsigned int))
  • Inverser
  • char utf32 en NSString

+ (NSString *)reverseString3:(NSString *)str {
    unsigned int *cstr, buf, len = [str length], i;  
    cstr  = (unsigned int *)[str cStringUsingEncoding:NSUTF32LittleEndianStringEncoding];
    for (i=0;i < len/2;i++) buf = cstr[i], cstr[i] = cstr[len -i-1], cstr[len-i-1] = buf;
    return [[NSString alloc] initWithBytesNoCopy:cstr length:len*4 encoding:NSUTF32LittleEndianStringEncoding freeWhenDone:NO];
}

Exemple : Apple_is ---> si_elppA

1voto

user2782756 Points 1
NSMutableString *result = [NSMutableString stringWithString:@""];
    for (long i = self.length - 1; i >= 0; i--) {
        [result appendFormat:@"%c", [self characterAtIndex:i]];
    }
    return (NSString *)result;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X