【问题标题】:Sort array of String containing MonthYear combination对包含 MonthYear 组合的 String 数组进行排序
【发布时间】:2020-01-09 09:33:52
【问题描述】:

我有以下字符串数组。

 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);

【问题讨论】:

  • return [date2 compare:date1]; 代替?
  • 考虑使用可直接排序的yyyyMM格式。
  • 我试过你的代码,如果我返回[date2 compare:date1],就像拉姆说的那样,那么它就可以了。

标签: objective-c sorting nsarray


【解决方案1】:

这是为有这种奇怪要求的人准备的, 换句话说,我所做的是,我为每个字符串添加了静态 01 作为日期,然后应用日期排序,然后一旦我得到我想要的结果,我想要它以相反的顺序,所以我反转了结果数组,然后我将删除额外的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]];

【讨论】:

  • 这个答案太复杂了。
【解决方案2】:

我发现了你的问题。实际上有两个问题。

  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

【讨论】:

  • 您不必删除空格:dateArray = [dateString componentsSeparatedByString:@", "]
  • NSComparator 块应该返回 NSComparisonResult,而不是 BOOL
  • 在块外创建一个格式化程序更快。
  • @Willeke:如果不删除空格,代码将不起作用,请实现此代码并检查。不要盲目评论。你检查过这段代码吗?
  • 我试过dateArray = [dateString componentsSeparatedByString:@", "] 并且它有效。你试过了吗?问题中没有使用array,可能是错误,应该是[NSArray arrayWithObjects:@"042018", @"052018", @"122018", @"012019", @"022019", @"032019", nil]
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2016-04-03
  • 1970-01-01
相关资源
最近更新 更多