2012-11-13 21 views
6

アルファベット順に並べ替えることを試みています。例えば、トマトが甘くなるか、スタックが早くなる。NSStringの文字をアルファベット順にソート

私はCでchar配列を使ってこれを行ういくつかのメソッドを見つけましたが、NSStringオブジェクトの範囲内で動作するようになっています。

NSStringオブジェクト自体の中で簡単な方法がありますか?

答えて

4

は、私は別のだと思います文字列の配列への文字列(配列の各文字列には、元の文字列の文字が1つだけ含まれます)。並べ替えると配列はOKになります。これは効率的ではありませんが、文字列がそれほど長くない場合は十分です。私はコードをテストしました。

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

あなたのメソッド名は 'substringWithRangeを使用することsortedArrayUsingComparatorなくsortUsingComparator – tiguero

+1

注意する必要があります:'このように、この手順はo̶' 'のような構成文字では動作しないことを意味します。これは致命的な異論ではなく、ただの警告です。 –

10

各文字列の文字をNSArrayNSNumber個のオブジェクトに格納して並べ替えることができます。ちょっと高価だと思われますので、代わりにqsort()を使用してください。

ここでは、Objective-Cのカテゴリ(未テスト)として提供されます:

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); 
関連する問題