【问题标题】:Is there a method to sort an NSString?有没有一种方法可以对 NSString 进行排序?
【发布时间】:2011-03-31 17:07:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你知道字符串的内容吗?例如,它们是 ASCII 码吗?
  • 是的,字符是 ASCII,但不仅仅是字母和/或数字。
  • “对字符串进行排序”是什么意思?你想按字母顺序排列单词吗?您希望所有字符以某种确定的顺序完全重新排列吗?
  • 我不在乎它是如何排序的,只要它是规范的:为你喜欢的字符选择任何顺序,然后总是按那个顺序排序。
  • @Joe Blow... 我不使用单词,只是 NSStrings 的 ASCII 字符。我不想找到排列;我想比较两个字符串,如果它们是彼此的排列,则返回 YES,否则返回 NO。

标签: iphone objective-c sorting nsstring


【解决方案1】:

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

创建 2 个计数器数组,ac 和 bc,大小均为 128 用 0 初始化它们 为字符串 a 中的每个字符 c 生成 ac[c]++ 对于字符串 b 中的每个字符 c 使 bc[c]++ 如果 ac 和 bc 中的所有 128 个计数器都相同,则它们相互排列

这甚至可能比排序运行得更快。

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

- (BOOL)isPermutation:(NSString *)string1 ofString:(NSString *)string2 { if ([string1 长度] != [string2 长度]) { 返回错误; } NSInteger 计数器 1[128]; NSInteger 计数器 2[128]; NSInteger i; NSInteger len = [string1 长度]; 对于 (i = 0; i

【讨论】:

  • 适用于 7 位 ascii,但不适用于 NSString;对于 NSString,您可能正在处理长度不超过 32 位的字符....
  • @bbum,OP 说他的字符串是 ASCII。 @taskinoor - 这个算法更聪明,我喜欢它。
  • 其实我是在确认字符串只包含ASCII之后才写这个答案的。
  • 哦——我完全理解算法,绝对。
  • @Peng 哇,就做出一个糟糕的工程决策而言,情况比我想象的还要糟糕! “标准的 iOS”程序运行速度惊人,大约 15,000 Hz。 (iPad1。)任务,我能够让你在那里展示的例程以 30 倍的速度运行。 15kHz 是封闭的,标准例程应在任何需要可靠性的情况下使用。 (当然,科学计算、快速循环等使用低级例程)
【解决方案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;
}

【讨论】:

  • @Carl Norum:我很确定你可以;)(在这种情况下,const 并没有那么大的意义。C 编译器会阻止在其范围内重新分配常量变量,但是当在另一个作用域中使用时,编译器不知道它被声明为const。)
  • @Joe Blow:您的解决方案有效,但为什么要为字符串中的每个字母创建一个NSMutableArray 对象一个字符串对象,然后然后 对每个对象进行排序,然后然后将数组重新连接成一个字符串,当您可以抓取字符数组时,将其传递给qsort(一个非常常用的C stdlib 函数)然后转那个变回字符串? C 可能是疯狂的,但有人可能会争辩说,创建一大堆临时对象只是为了对字母进行排序也是疯狂的。这种方法也很容易进行单元测试。
  • @Joe Blow:你知道 Objective-C 是在基于 C 的运行时之上实现的,是吗? (有时请查看/usr/include/objc。)另外,如果您不喜欢使用C,您如何使用CoreFoundation?你是如何与 QuickTime pre-Snow Leopard 交互的?你如何生成随机数?你从不在你的 Objective-C 代码中使用任何函数吗?你从来没有在你的应用程序中使用过 OpenGL 吗?为什么这个代码在 App Store(或 Mac App Store)程序中被拒绝?我不知道你在哪里工作,但我可以向你保证,工作的地方,我不会因为编写更高效、可读代码而被解雇。
  • @Joe Blow:我编写 Mac 软件已经五年多了。你一直断言,不知何故,C 代码使程序不可靠,但你没有断言为什么。您是否认为 OS X 附带的 C 标准库写得不好?我敢打赌,几乎每个 Mac 应用程序都以某种方式使用“纯 C”(而且,由于 Objective-C 运行时是用 C 实现的,您可以争辩说每个 Mac 或 iPhone 应用程序都使用 C) .
  • @rsanchezsaez:嗯,这不是问题所在。不幸的是,Joe Blow 在这个线程中删除了几乎所有他的 cmets,所以实际的上下文/问题已经丢失了。
【解决方案3】:

如果您的字符始终是 ASCII,您可以提取字节,然后对它们使用 POSIX 排序例程之一:

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

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

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

【讨论】:

  • 如果myString 超过100字节怎么办?
  • @mipadi,在这种情况下超级不安全。 =) 我只是觉得char myCString[[myString length] + 1] 看起来很糟糕。我会重新编辑它。
  • 自从我们讨论了写入内存的讨论,人们不应该写入...... ;)
猜你喜欢
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
相关资源
最近更新 更多