有没有一种方法来对NSString进行排序?

时间:2011-03-31 17:07:32

标签: iphone objective-c sorting nsstring

有没有人知道是否有一种方法来对ASCII字符的NSString进行排序?理想情况下,我想要一个方法来检查一个字符串是否是另一个字符串的排列,所以我的想法是以规范的方式对两个字符串进行排序,然后比较它们。任何想法将不胜感激。感谢。

编辑:这是我更准确的追求。我想要一个方法,它将两个NSStrings作为输入并返回BOOL

- (BOOL)isPermutation:(NSString *)string1 
             ofString:(NSString *)string2; 

如果一个字符串可以重新排列到另一个字符串中,则返回的值应为YES,否则为NO

NSStrings是具有ASCII字符的任意字符串,而不是句子,数字或单词。只是带有ASCII字符的任意字符串。

3 个答案:

答案 0 :(得分:7)

你真的需要排序来检查这个吗?考虑算法。

create 2 counter arrays, ac and bc, both of size 128
initialize them with 0
for each char c in string a make ac[c]++
for each char c in string b make bc[c]++
if all 128 counters in ac and bc are same, then they r permutation of one another

这甚至可以比排序更快。

编辑:这是一种可能的实施方式。由于我没有编译代码,可能会有一些小错误。

- (BOOL)isPermutation:(NSString *)string1 ofString:(NSString *)string2 {
    if ([string1 length] != [string2 length]) {
        return FALSE;    
    }

    NSInteger counter1[128];
    NSInteger counter2[128];
    NSInteger i;
    NSInteger len = [string1 length];

    for (i = 0; i < 128; i++) {
        counter1[i] = counter2[i] = 0;
    }

    for (i = 0; i < len; i++) {
        unichar ch1 = [string1 characterAtIndex:i];
        unichar ch2 = [string2 characterAtIndex:i];
        counter1[ch1]++;
        counter2[ch2]++;
    }

    for (i = 0; i < 128; i++) {
        if (counter1[i] != counter2[i]) {
            return FALSE;
        }
    }

    return TRUE;
}

答案 1 :(得分:2)

如果您的字符始终是ASCII,您可以获取字节数,然后使用其中一个POSIX排序例程:

char myCString[[myNSString length] + 1];
memcpy(myCString, [myNSString UTF8String], [myNSString length]);

qsort(myCString, [myNSString length], 1, compareChars); 

其中compareChars()是您编写的用于进行字符到字符比较的函数 - 在这种情况下可能与<一样简单。

答案 2 :(得分:2)

你的意思是,对字符串中的字母进行排序? NSString上没有方法,但创建一个方法很容易。 Here's一个快速而肮脏的例子(您可能需要根据自己的目的进行调整):

#import <Foundation/Foundation.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static int compare_char(const char *a, const char *b)
{
    if (*a > *b) {
        return 1;
    } else if (*a < *b) {
        return -1;
    } else {
        return 0;
    }
}

@interface NSString (Sorting)
- (NSString *)stringBySortingCharacters;
@end

@implementation NSString (Sorting)
- (NSString *)stringBySortingCharacters
{
    const char *s = [self UTF8String];
    char *s2 = (char *) calloc([self length]+1, 1);
    if (!s2) return nil;
    strncpy(s2, s, [self length]);
    qsort(s2, [self length], 1, compare_char);
    NSString *ret = [NSString stringWithUTF8String:s2];
    free(s2);
    return ret;
}
@end

int main(int argc, char **argv)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *s1 = @"string";
    NSString *s2 = @"the quick brown fox jumps over the lazy dog";
    printf("Sorted: %s\n", [[s1 stringBySortingCharacters] UTF8String]);
    printf("Sorted: %s\n", [[s2 stringBySortingCharacters] UTF8String]);

    [pool release];
    return 0;
}