排序数组时忽略某些字符串

时间:2010-12-06 07:12:47

标签: iphone objective-c ios4 nsstring nsarray

我正在制作语言应用程序,并且我有一长串与该语言相关的词汇(德语,如果有人感兴趣的话)。我的应用程序中的功能是在用德语单词或英语单词对表格视图进行排序之间切换。

当我使用以下内容时:

NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:type];
NSString *string = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSArray *array = [[string componentsSeparatedByString:@"\n"] sortedArrayUsingSelector:@selector(compare:)];

它绝对完美 - 我的意思是,完全符合预期。然而,我想对此进行改进的是,有一些单词,如动词或名词,总是前缀前缀,如“to”,如“to do something”,或“the”前面的名词。所以我想要做的是以某种方式将这些排除在我的排序之外,因为否则我最终将所有动词按字母顺序排列在我的数组中的“t”部分,这对用户不是很友好。

我查看了有关NSString和NSArray的Apple文档,因为这是compare函数所在的位置(除非我非常错误),而且我找不到任何有意义的方法我。这是我第一次做这样的数据处理,所以我可能会遗漏一些简单的东西,所以我真的很感激一些帮助。

非常感谢

Michaeljvdw

4 个答案:

答案 0 :(得分:4)

你走在正确的轨道上。您想要使用而不是(内置)compare方法的是编写自己的方法,如果它们存在,可以消除“to”或“the”位,然后使用现有的{{1方法。

你的电话会是这样的:

compare

使用以下方法为NSArray *array = [[string componentsSeparatedByString:@"\n"] sortedArrayUsingSelector:@selector(myCompare:)]; 提供自定义类别:

NSString

答案 1 :(得分:1)

你可能会对localizedCompare:localizedStandardCompare:感到幸运,但我不认为其中任何一个都会删除你想要的文章和介词。相反,您可能需要在NSString上定义一个类别,该类别提供您正在寻找的特定排序方式:

 @interface NSString (MySortAdditions)
 - (NSComparisonResult)compareWithoutArticles:(NSString *)other;
 @end

 @implementation NSString (MySortAdditions)
 - (NSComparisonResult)compareWithoutArticles:(NSString *)other {
    NSMutableString *mutableSelf = [NSMutableString stringWithString:self];
    [mutableSelf
        replaceOccurrencesOfString:@"das"
        withString:@""
        options:NSCaseInsensitiveSearch
        range:NSMakeRange(0, [mutableSelf length])
    ];

    ...

    // delete articles from 'other' too

    NSCharacterSet *trimSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSString *trimmedSelf = [mutableSelf stringByTrimmingCharactersInSet:trimSet];
    NSString *trimmedOther = ...;

    return [trimmedSelf localizedCaseInsensitiveCompare:trimmedOther];
 }
 @end

然后,您可以使用@selector(compareWithoutArticles:)作为NSArray的排序选择器。

答案 2 :(得分:1)

首先,不要使用compare:。请改用localizedCompare:。这很重要,因为á是在a之后还是在z后出现,因为单独的字母取决于语言。 localizedCompare:负责照顾。

- 修改

正如贾斯汀所说,localizedStandardCompare:是要使用的选择器!我不知道那种方法。正如文档中所述,localizedStandardCompare:的作用超过了localizedCompare:,尽管该文档并没有详细说明它的作用。

- 编辑结束

如果你想要更多,你需要自己实现。您可以使用类别来实现此目的。首先声明它

  @interface NSString (MichaelsSuperCompareCategory)
       -(NSComparisonResult)michaelsSuperCompare:(NSString*)string;
  @end

然后实现它

  @interface NSString (MichaelsSuperCompareCategory)
       -(NSComparisonResult)michaelsSuperCompare:(NSString*)string{
             ...
       }
  @end

这样您就可以向现有类添加方法。然后你可以使用

NSArray *array = [[string componentsSeparatedByString:@"\n"] 
                                 sortedArrayUsingSelector:@selector(michaelsSuperCompare:)];

重要的是在方法名称前加上一些与众不同的东西,而不是意外地与Apple使用的内部方法崩溃。

至于功能,你需要自己实现,据我所知。您可以使用[NSLocale currentLocale]获取当前区域设置。您可以为您所知的语言实现更好的行为,然后对于未知语言默认为localizedCompare:

答案 3 :(得分:0)

我会以某种方式对所有数据进行-replaceOccurancesOfStrings,例如“To” - > “” - 然后重新加载数据。 (或者这可以在文本编辑器中)

要考虑的另一件事是将“走路”改为“走路(走)”,这可以提前完成(并且当用户按字母顺序滚动时也会减少对用户的混淆)。