包含MonthYear组合的字符串的排序数组

问题描述 投票:0回答:2

我有以下字符串数组。

 NSArray *array = [NSArray arrayWithObject:@"042018, 052018, 122018, 012019, 022019, 032019"];

我想按MonthYear组合的顺序对该数组进行排序,即032019在122018之前。

结果应给出

(032019,022019,012019,122018,052018,042018)

我尝试过此代码,但未给出满意的结果。请帮助。

            NSDateFormatter *fmtDate = [[NSDateFormatter alloc] init];
                    [fmtDate setDateFormat:@"mmyyyy"];
            NSComparator compareDates = ^(id string1, id string2)
                    {
                        NSDate *date1 = [fmtDate dateFromString:string1];
                        NSDate *date2 = [fmtDate dateFromString:string2];
                        return [date1 compare:date2];
                    };
            NSArray *sortedYearKeys = [[dicSection allKeys] sortedArrayUsingComparator:compareDates];
            NSLog(@"array:%@",sortedYearKeys);
objective-c sorting nsarray
2个回答
0
投票

我知道了你的问题。实际上有两个问题。

  1. array仅包含一个对象,即NSString,因此首先您需要将该字符串转换为NSArray,我的意思是需要分隔内部日期对象。

您可以通过NSString的方法componentsSeparatedByString来做到这一点。

  1. 分离对象后,每个对象仍添加一个空格,这在比较日期对象时会引起问题。

因此,在将其转换为数组组件之前,您需要从字符串中删除所有空格。

  1. 让我们一一看。您指定的数组。

    NSArray *array = [NSArray arrayWithObject:@"042018, 052018, 122018, 012019, 022019, 032019"];
    
  2. 从此数组获取字符串

    NSString *dateString = array[0];
    
  3. 现在,此字符串包含空格,这是此处的问题。

    // Remove extra characters like whitespace from your string
    
    NSString *dateString = array[0];
    //Output: 042018, 052018, 122018, 012019, 022019, 032019
    
    NSString *trimmedString = [dateString stringByReplacingOccurrencesOfString:@" " withString:@""];
    //Output: 042018,052018,122018,012019,022019,032019
    

您可以观察到以上输出中的空格,该空格在trimmedString中已删除。

  1. 将字符串转换为数组:

    NSArray *dateArray = [trimmedString componentsSeparatedByString:@","];
    
  2. 最后一步是对该数组进行排序

     NSArray *sortedArray = [dateArray sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
        NSDateFormatter *formatter = [NSDateFormatter new];
        [formatter setDateFormat:@"MMyyyy"];
    
        NSDate *date1 = [formatter dateFromString:obj1];
        NSDate *date2 = [formatter dateFromString:obj2];
        return ([date1 compare:date2] == NSOrderedAscending) ? YES : NO;
    }];
    
    NSLog(@"sortedArray :%@\n", sortedArray);
    
    // Output: (
       032019,
       022019,
       012019,
       122018,
       052018,
       042018
    )
    

如果您希望将其转换为字符串,则可以使用方法componentsJoinedByString来完成

NSString *sortedString = [sortedArray componentsJoinedByString:@", "];

请注意,我在,之后添加了一个额外的空格以匹配您期望的结果。

//Output: 032019, 022019, 012019, 122018, 052018, 042018

-1
投票

这是针对具有此类奇怪要求的任何人,在Words中,我要做的是,我为每个字符串添加了静态01作为Date,然后应用Date排序,然后在获得所需结果后,我希望按相反的顺序进行操作,因此我将结果数组求逆,然后将多余的内容删除我之前添加的01。

        NSMutableArray *array = [NSMutableArray arrayWithArray:[dicSection allKeys]];
        int i =0;
        for(;i<(int)array.count;){
            NSString *str = [array objectAtIndex:i];
            str = [NSString stringWithFormat:@"01%@",str];
            [array replaceObjectAtIndex:i withObject:str];
            i++;
        }

        NSDateFormatter *fmtDate = [[NSDateFormatter alloc] init];
                [fmtDate setDateFormat:@"ddmmyyyy"];
        NSComparator compareDates = ^(id string1, id string2)
                {
                    NSDate *date1 = [fmtDate dateFromString:string1];
                    NSDate *date2 = [fmtDate dateFromString:string2];
                    return [date1 compare:date2];
                };
        NSArray *sortedYearMothKeys = [array sortedArrayUsingComparator:compareDates];
        sortedYearMothKeys = [NSMutableArray arrayWithArray:[[sortedYearMothKeys reverseObjectEnumerator] allObjects]];
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.