Сортировать массив строк, содержащих комбинацию MonthYear - PullRequest
0 голосов
/ 09 января 2020

У меня есть следующий массив строк.

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

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Я разобрался с твоей проблемой. На самом деле есть две проблемы.

  1. array содержит только один объект NSString, поэтому сначала вам нужно преобразовать эту строку в NSArray, я имею в виду, вам нужно отделить внутреннюю объекты даты.

Что вы можете сделать это методом NSString componentsSeparatedByString.

После разделения объектов к каждому объекту по-прежнему добавляется один пробел, который вызывает проблему при сравнении объектов даты.

Поэтому перед преобразованием в строку необходимо удалить все пробелы из строки. Компоненты массива.

  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.

Преобразование строки в массив:

NSArray *dateArray = [trimmedString componentsSeparatedByString:@","];

И, последний шаг, сортировка этого массива

 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
)

Если Вы можете sh преобразовать его в строку, вы можете сделать это с помощью метода componentsJoinedByString

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

Обратите внимание, что после , я добавил один дополнительный пробел, чтобы соответствовать желаемому результату.

//Output: 032019, 022019, 012019, 122018, 052018, 042018
0 голосов
/ 09 января 2020

Это для тех, у кого есть такие странные требования. На словах я добавил stati c 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]];
...