2012-11-13 13 views
6

Ich versuche, Wörter in alphabetischer Reihenfolge neu anzuordnen. Zum Beispiel, Tomate würde amoott, oder Stapel würde ackst werden.Sortieren von Zeichen in NSString in alphabetischer Reihenfolge

Ich habe einige Methoden gefunden, dies in C mit Char-Arrays zu tun, aber ich habe Probleme, das innerhalb der Grenzen des NSString-Objekts zu arbeiten.

Gibt es eine einfachere Möglichkeit, dies innerhalb des NSString-Objekts selbst zu tun?

Antwort

4

Ich denke, getrennt Die Zeichenfolge in ein Array von Zeichenfolge (jede Zeichenfolge im Array enthält nur ein Zeichen aus der ursprünglichen Zeichenfolge). Dann sortiere das Array in Ordnung. Dies ist nicht effizient, reicht aber aus, wenn die Saite nicht sehr lang ist. Ich habe den Code getestet.

NSString *str = @"stack"; 
NSMutableArray *charArray = [NSMutableArray arrayWithCapacity:str.length]; 
for (int i=0; i<str.length; ++i) { 
    NSString *charStr = [str substringWithRange:NSMakeRange(i, 1)]; 
    [charArray addObject:charStr]; 
} 

NSString *sortedStr = [[charArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] componentsJoinedByString:@""]; 
+1

Ihre Methodennamen sollten sortedArrayUsingComparator sein und sortUsingComparator – tiguero

+1

Hinweis nicht, dass mit 'substringWithRange:' wie dies bedeutet, dass dieses Verfahren nicht mit zusammengesetzten Zeichen wie 'o' arbeiten. Dies ist kein fataler Einwand, nur eine Warnung. –

10

Sie könnten jeden der Zeichen der Zeichenfolge in NSArray von NSNumber Objekte speichern und dann sortieren. Scheint ein bisschen teuer, also würde ich vielleicht einfach qsort() stattdessen verwenden.

Hier ist es als Objective-C-Kategorie (ungetestet) zur Verfügung gestellt:

NSString + SortExtension.h:

#import <Foundation/Foundation.h> 

@interface NSString (SortExtension) 
- (NSString *)sorted; 
@end 

NSString + SortExtension.m:

#import "NSString+SortExtension.h" 

@implementation NSString (SortExtension) 

- (NSString *)sorted 
{ 
    // init 
    NSUInteger length = [self length]; 
    unichar *chars = (unichar *)malloc(sizeof(unichar) * length); 

    // extract 
    [self getCharacters:chars range:NSMakeRange(0, length)]; 

    // sort (for western alphabets only) 
    qsort_b(chars, length, sizeof(unichar), ^(const void *l, const void *r) { 
     unichar left = *(unichar *)l; 
     unichar right = *(unichar *)r; 
     return (int)(left - right); 
    }); 

    // recreate 
    NSString *sorted = [NSString stringWithCharacters:chars length:length]; 

    // clean-up 
    free(chars); 

    return sorted; 
} 

@end 
2
// --------- Function To Make an Array from String 
NSArray *makeArrayFromString(NSString *my_string) { 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < my_string.length; i ++) { 
     [array addObject:[NSString stringWithFormat:@"%c", [my_string characterAtIndex:i]]]; 
    } 
    return array; 

} 

// --------- Function To Sort Array 
NSArray *sortArrayAlphabetically(NSArray *my_array) { 
    my_array= [my_array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
    return my_array; 
} 

// --------- Function Combine Array To Single String 
NSString *combineArrayIntoString(NSArray *my_array) { 
    NSString * combinedString = [[my_array valueForKey:@"description"] componentsJoinedByString:@""]; 
    return combinedString; 
} 




// Now you can call the functions as in below where string_to_arrange is your string 
    NSArray *blowUpArray; 
    blowUpArray = makeArrayFromString(string_to_arrange); 
    blowUpArray = sortArrayAlphabetically(blowUpArray); 
    NSString *arrayToString= combineArrayIntoString(blowUpArray); 
    NSLog(@"arranged string = %@",arrayToString); 
Verwandte Themen