2012-11-13 11 views
6

Tôi đang cố sắp xếp lại các từ theo thứ tự bảng chữ cái. Ví dụ, cà chua sẽ trở thành amoott, hoặc ngăn xếp sẽ trở thành ackst.Sắp xếp các ký tự trong NSString thành thứ tự chữ cái

Tôi đã tìm thấy một số phương pháp để thực hiện điều này trong C với mảng char, nhưng tôi đang gặp sự cố để làm việc đó trong phạm vi giới hạn của đối tượng NSString.

Có cách nào dễ dàng hơn để thực hiện điều đó trong chính đối tượng NSString không?

Trả lời

4

Tôi nghĩ riêng chuỗi vào một mảng của chuỗi (mỗi chuỗi trong mảng chỉ chứa một char từ chuỗi gốc). Sau đó sắp xếp mảng sẽ là OK. Điều này là không hiệu quả nhưng là đủ khi chuỗi không phải là rất dài. Tôi đã kiểm tra mã.

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

tên phương pháp của bạn nên được sortedArrayUsingComparator và không sortUsingComparator – tiguero

+1

Lưu ý rằng sử dụng 'substringWithRange:' như thế này có nghĩa là thủ tục này sẽ không làm việc với các nhân vật bao gồm như 'O'. Đây không phải là một phản đối gây tử vong, chỉ là một lời cảnh báo. –

10

Bạn có thể lưu trữ từng ký tự của chuỗi thành một đối tượng NSArray của NSNumber và sau đó sắp xếp các ký tự đó. Có vẻ hơi đắt tiền, vì vậy tôi có lẽ chỉ cần sử dụng qsort() thay thế.

Ở đây nó được cung cấp như là một thể loại Objective-C (chưa được kiểm tra):

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