【问题标题】:sort nsarray by second word. (by surname in "firstname surname" kind of strings array)按第二个单词对 nsarray 进行排序。 (按姓氏在“名字姓氏”类型的字符串数组中)
【发布时间】:2014-01-06 05:41:39
【问题描述】:

我有 nsarray 字符串,例如“fistname surname”。现在我想按第二个单词(即姓氏)对该字符串数组进行排序。 我用了这个方法

NSArray *sortedArray=[[teachersList allValues] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    NSLog(@"After %@",sortedArray);

但它会根据第一个单词对数组进行排序。

而且我也有只有名字的元素或字符串仅表示第一个单词。

那么该怎么做呢?

编辑

@Janak Nirmal

我修改后的代码是:

while([resultSet next])
{
    [teachersList setObject:[NSString stringWithFormat:@"%@ %@",[resultSet stringForColumn:@"first_name"],[resultSet stringForColumn:@"last_name"]] forKey:[resultSet stringForColumn:@"email_id"]];
    [emailList addObject:[resultSet stringForColumn:@"email_id"]];
    appDelegate.grade=[resultSet stringForColumn:@"grade"];

}

    //NSArray *sortedArrays=[[teachersList allValues] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];


   NSArray *sortedArray = [[teachersList allValues] sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
        NSString *firstTeacher2ndWord = [[[[(Teacher*)a name] componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        NSString *secondTeacher2ndWord = [[[[(Teacher*)b name] componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        return [firstTeacher2ndWord compare:secondTeacher2ndWord];
    }];

但我收到以下错误

[__NSCFString name]: 无法识别的选择器发送到实例

【问题讨论】:

    标签: ios objective-c arrays sorting


    【解决方案1】:

    你可以做这样的排序,

    NSArray *sortedArray = [teacherList sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
        NSString *firstTeacher2ndWord = [[[[(Teacher*)a name] componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        NSString *secondTeacher2ndWord = [[[[(Teacher*)b name] componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        return [firstTeacher2ndWord compare:secondTeacher2ndWord];
    }];
    //Assuming in above you have atleast 2 words in name 
    //i.e. objectAtIndex:1 doesn't fail or you need to put condition 
    //there according to your needs
    

    假设您的模型结构如下,

    @interface Teacher : NSObject
    
    @property (nonatomic,strong) NSString *name;
    
    @end
    

    编辑

    由于您的 [teacherList allValues] 将直接保存字符串值,您应该将其编写如下

    NSArray *sortedArray = [[teachersList allValues] sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
        NSString *firstTeacher2ndWord = [[[((NSString*)a) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        NSString *secondTeacher2ndWord = [[[((NSString*)b) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        return [firstTeacher2ndWord compare:secondTeacher2ndWord];
    }];
    

    以上代码将以排序方式直接为您提供所有值的数组。

    【讨论】:

    • 谢谢,但我想知道它如何与多个元素一起工作,这意味着 thirdteachers 、fourthteacher 等。
    • @VirendraRavalji 这只是变量名,它将遍历数组中的所有元素。你总是可以给他们不同的名字,例如firstModel2ndWord 和 secondModel2ndWord 检查sortedArrayUsingComparator
    • @VirendraRavalji 您应该在您的问题中添加您的代码,而不是在我的答案中。它被审稿人拒绝了。
    • 很高兴它为您工作,很高兴回馈社区:D
    • hie janak 我遇到了新的排序问题,我在这里发布了问题stackoverflow.com/questions/21012740/…
    【解决方案2】:

    因为你有一个字符串,它总是从“first name”开始比较

    所以你必须先用空格分割字符串

    NSArray *listItems = [list componentsSeparatedByString:@" "];
    

    从这里你必须用这个拆分字符串构建一个名称字典,比如

    @{@"FirstName" : listItems[0], "FirstName" : listItems[1]}
    

    add into array and then you can sort这个

    NSArray *keys = [theDictionary allKeys];
    NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(compareMethod:)];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 2013-01-07
      • 2010-10-26
      相关资源
      最近更新 更多