1

我是 iOS 新手,正在尝试构建一个字典应用程序。我有一个NSMutableDictionaryof 单词和定义,我将其单词(键)保存在一个单独NSArrayNSStringscalledsortedWords中。

sortedWords = [[NSMutableArray alloc] initWithArray:[[entries allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]];

如您所见,我正在对字典中的每个键进行不区分大小写的比较。然而,最近的一次数据库更新在我的字典中包含了新词,这些新词仅仅是以破折号开头的后缀。这些条目现在位于所有以字母 A 开头的条目之前,并按字母顺序列出。

我想要实现的是保持所有条目甚至后缀的字母顺序,但使后缀成为每个字母的第一个条目。例如,对于E,条目的顺序将是:

-er
-est
each
eager
eagle

我怎样才能做到这一点?

4

4 回答 4

1

您可以使用自己的比较器请求排序。您的比较器基本上删除了 - 前缀,然后比较两个字符串。像这样的东西:

[sortedWords sortUsingComparator:^(NSString *obj1, NSString *obj2) {

    NSString *temp1 = obj1;
    NSString *temp2 = obj2;
    if ([obj1 hasPrefix:@"-"])
         temp1 = [obj1 substringFromIndex:1];
    if ([obj2 hasPrefix:@"-"])
         temp2 = [obj2 substringFromIndex:1];

    return [temp1 caseInsensitiveCompare:temp2];
}];

我没有测试这段代码,但它至少应该作为一个指南!

于 2013-01-28T13:12:06.183 回答
1

感谢@manecosta 的回答。但是,完整的解决方案相当复杂:

#define hasDash hasPrefix:@"-"
// ...

NSMutableArray *arr = [NSMutableArray arrayWithArray:@[@"-con", @"baby",
    @"context", @"zebra", @"-ar", @"-am", @"Big", @"chastity",
    @"-b", @"American", @"brute"]];

[arr sortUsingComparator:^NSComparisonResult(NSString *s1, NSString *s2) {
    if (![s1 hasDash] && ![s2 hasDash]) {
        return [s1 caseInsensitiveCompare:s2];
    } else if ([s1 hasDash] && [s2 hasDash]) {
        NSString *c1 = [s1 substringFromIndex:1];
        NSString *c2 = [s2 substringFromIndex:1];
        return [c1 caseInsensitiveCompare:c2];
    } else if ([s1 hasDash]) {
        NSString *c1 = [s1 substringFromIndex:1];
        if ([[[c1 substringToIndex:1] uppercaseString]
             isEqualToString:[[s2 substringToIndex:1] uppercaseString]]) {
            return NSOrderedAscending;
        } else {
            return [c1 caseInsensitiveCompare:s2];
        }
    } else { // if ([s2 hasDash]) {
        NSString *c2 = [s2 substringFromIndex:1];
        if ([[[s1 substringToIndex:1] uppercaseString]
             isEqualToString:[[c2 substringToIndex:1] uppercaseString]]) {
            return NSOrderedDescending;
        } else {
            return [s1 caseInsensitiveCompare:c2];
        }
    }
}];
于 2013-01-31T06:49:07.683 回答
0

您可以创建自己的比较功能,并随心所欲地发挥您的魔力

在您的班级某处添加此 C++ 外观方法

NSInteger sortStrings(id value1, id value2, void *context); // This is just to avoid a warning when compiling the project :)

NSInteger sortStrings(id value1, id value2, void *context) {

    ... value1 and value2 will be NSStrings, compare them however you want ....

    returning -1 will mean value1 should come before
    returning 1 will mean value2 should come before
    returning 0 will mean they are equal and it won't matter which one is first

}

要进行排序,请执行以下操作:

[array sortUsingFunction:sortStrings context:nil];

编辑

你可以传递任何你想要的东西context:,它会在context对象的函数中提供给你,以防你需要任何环境变量或其他东西

在进行排序时,数组也需要是一个 NSMutableArray

于 2013-01-28T13:02:26.027 回答
0

您可以使用下面的代码实现自己的算法进行比较。

NSArray *sortedArray = [tempArray sortedArrayUsingComparator:^(id o1, id o2) {
            NSString *string1 = (NSString *)o1;
            NSString *string2 = (NSString *)o2;

            return [string1 compare:string2];
        }];
于 2013-01-28T13:09:07.487 回答