忽略标点符号的排序(Objective-C)

Cap*_*rog 8 sorting objective-c

我正在尝试对iOS UITableView对象进行排序.我目前正在使用以下代码:

// Sort terms alphabetically, ignoring case
[self.termsList sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
Run Code Online (Sandbox Code Playgroud)

这对我的清单排序,惠斯特无视案例.但是,忽略标点符号也会很好.例如:

c.a.t.
car
cat
Run Code Online (Sandbox Code Playgroud)

应按如下方式排序:

car
c.a.t.
cat
Run Code Online (Sandbox Code Playgroud)

(实际上,两只猫(猫或猫)中的哪一只首先出现并不重要,只要它们彼此相邻排序即可.

有一个简单的方法来解决这个问题吗?我假设解决方案将涉及从字符串中提取JUST字母数字字符,然后比较它们,然后将它们返回到以前的状态,并再次包含非字母数字字符.

事实上,我真正关心的唯一字符是句点(.),但是如果有一个解决方案可以轻松涵盖所有标点符号,那么知道它就会很有用.

注意:我在一个月前问过这个完全相同的Java问题.现在,我在Objective-C中创建了相同的解决方案.我想知道iOS API是否有任何技巧可以让这个变得简单...

编辑:我已尝试使用以下代码去除标点符号并填充我排序的另一个数组(由@tiguero建议).但是,我不知道如何做最后一步:实际按照第二个数组的顺序对第一个数组进行排序.这是我的代码:

    NSMutableArray *arrayWithoutPunctuation = [[NSMutableArray alloc] init];
    for (NSString *item in arrayWithPunctuation)
    {
        // Replace hyphens/periods with spaces
        item = [item stringByReplacingOccurrencesOfString:@"-" withString:@" "]; // ...hyphens
        item = [item stringByReplacingOccurrencesOfString:@"." withString:@" "]; // ...periods
        [arrayWithoutPunctuation addObject:item];
    }
    [arrayWithoutPunctuation sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
Run Code Online (Sandbox Code Playgroud)

这提供了'arrayWithoutPunctuation',它被排序,但当然不包含标点符号.这是不好的,因为虽然它现在排序很好,但它不再包含对数组首先至关重要的标点符号.我需要做的是根据'arrayWithoutPunctuation'的顺序排序'arrayWithPunctuation'...任何帮助表示赞赏.

tig*_*ero 9

您可以在a上使用比较块NSArray,您的代码将如下所示:

NSArray* yourStringList = [NSArray arrayWithObjects:@"c.a.t.", @"car", @"cat", nil];
NSArray* yourStringSorted = [yourStringList sortedArrayUsingComparator:^(id a, id b){
        NSString* as = (NSString*)a;
        NSString* bs = (NSString*)b;

        NSCharacterSet *unwantedChars = [NSCharacterSet characterSetWithCharactersInString:@"\\.:',"];
        //Remove unwanted chars
        as = [[as componentsSeparatedByCharactersInSet: unwantedChars] componentsJoinedByString: @""];
        bs = [[as componentsSeparatedByCharactersInSet: unwantedChars] componentsJoinedByString: @""];

        // make the case insensitive comparison btw your two strings
        return [as caseInsensitiveCompare: bs];
    }];
Run Code Online (Sandbox Code Playgroud)

这可能不是最有效的代码实际上是另外一个选择是首先你的阵列上进行迭代,并删除所有不必要的字符,并使用selectorcaseInsensitiveCompare方法:

 NSString* yourStringSorted = [yourStringList sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
Run Code Online (Sandbox Code Playgroud)

  • @CaptainProg:tiguero的第一个建议将实现你想要的. (4认同)