Есть ли способ отменить NSNumericSearch, чтобы можно было упорядочить строки NSS с номерами в них в 9, 8, 7, 6 ... и т. Д.? - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть код, который возвращает NSComparisonResult. Мои коды прекрасно работают для сортировки моих массивов в порядке возрастания и убывания, когда они представляют собой строки NSS, содержащие только буквенные символы.

Когда в NSStrings есть числа, такие как Seinfeld (Season 5) и Seinfeld (Season 6), они сортируются правильно. По возрастанию порядка 5, а затем 6. Но по убыванию все равно сортируется по 5 и 6. Вот пример:

Ascending:
Batman,
Seinfeld (Season 5),
Seinfeld (Season 6),
Zoolander

Descending:
Zoolander,
Seinfeld (Season 5),
Seinfeld (Season 6),
Batman

Нисходящий код, который у меня есть, выглядит так, чтобы вернуть сравнение:

return [(NSString *)secondString compare:(NSString *)firstString options:NSNumericSearch];

Есть идеи, как перевернуть строки NSS с числами в них?

Кстати, я не могу использовать NSSortDescriptor в моем случае. Код, который у меня есть, требует сборки пользовательской функции, потому что мне нужно добавить строку и т. Д., Прежде чем произойдет сортировка. Я не включил все это для простоты.

Ответы [ 5 ]

1 голос
/ 19 октября 2011

По сути тот же комментарий, что и выше, но вот полный источник и вывод, чтобы доказать, что он работает (протестировано на симуляторе iOS 4.3):

NSArray * strings = [NSArray arrayWithObjects: @"Seinfeld (Season 6)", @"Batman", @"Seinfeld (Season 5)", @"Zoolander", nil];
NSArray * sorted1 = [strings sortedArrayUsingComparator: ^(id first, id second) {
                        return [(NSString *)first compare:(NSString *)second options: NSNumericSearch];
                    }];
NSArray * sorted2 = [strings sortedArrayUsingComparator: ^(id first, id second) {
    return - [(NSString *)first compare:(NSString *)second options: NSNumericSearch];
    // or (to be more clear, but less efficient)
    // return -1 * [(NSString *)first compare:(NSString *)second options: NSNumericSearch];
}];

NSLog(@"starting: %@", strings );
NSLog(@"sort1: %@", sorted1 );
NSLog(@"sort2: %@", sorted2 );

output:

2011-10-19 02:09:07.557 test2222[16793:207] starting: (
  "Seinfeld (Season 6)",
  Batman,
  "Seinfeld (Season 5)",
  Zoolander
)

2011-10-19 02:09:07.558 test2222[16793:207] sort1: (
  Batman,
  "Seinfeld (Season 5)",
  "Seinfeld (Season 6)",
  Zoolander
)

2011-10-19 02:09:07.558 test2222[16793:207] sort2: (
  Zoolander,
  "Seinfeld (Season 6)",
  "Seinfeld (Season 5)",
  Batman
) 

В ответ на Итана Аллена вот результат теста с числами впереди:

2011-12-14 21:01:26.535 Test[7475:f803] starting: (
    "2001 Seinfeld (Season 6)",
    "1999 Batman",
    "2112 Seinfeld (Season 5)",
    "10 Zoolander"
)
2011-12-14 21:01:26.537 Test[7475:f803] sort1: (
    "10 Zoolander",
    "1999 Batman",
    "2001 Seinfeld (Season 6)",
    "2112 Seinfeld (Season 5)"
)
2011-12-14 21:01:26.537 Test[7475:f803] sort2: (
    "2112 Seinfeld (Season 5)",
    "2001 Seinfeld (Season 6)",
    "1999 Batman",
    "10 Zoolander"
)
1 голос
/ 18 октября 2011

Чтобы расширить ответ Бенджамина Майо:

Допустим, ваша «восходящая» функция сравнения такова:

static NSComparisonResult compareAscending(id s1, id s2, void *context) {
    return [s1 compare:s2 options:NSNumericSearch];
}

Тогда это должна быть ваша «нисходящая» функция сравнения:

static NSComparisonResult compareDescending(id s1, id s2, void *context) {
    return -compareAscending(s1, s2, context);
}
1 голос
/ 18 октября 2011

Этот код работает для меня:

 NSArray *array = [NSArray arrayWithObjects:@"Batman",
              @"Seinfeld (Season 5)",
              @"Seinfeld (Season 6)",
              @"Zoolander", nil];

// для возрастания

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id firstString, id secondString) {
  return [(NSString *)firstString compare:(NSString *)secondString  options:NSNumericSearch];
}];

  NSLog(@"========= %@================= ", sortedArray);

// для убывания

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id firstString, id secondString) {
  return [(NSString *)secondString compare:(NSString *)firstString  options:NSNumericSearch];
}];
1 голос
/ 28 сентября 2011

Просто вернитесь - (NSComparisonResult)

0 голосов
/ 28 сентября 2011

Так что я знаю, что это может быть болезненно, но я верю, что это будет полезно для вас в долгосрочной перспективе. Я рекомендую написать свою собственную функцию сортировки и вот что я буду делать. Вам могут понадобиться две функции, но таким образом вы можете настроить их так, как вам нужно. Для того, чтобы отсортировать их, я рекомендую просмотреть каждое значение ascii символов и сложить их все вместе, а затем сравнить их со значением ascii другого, все вместе, и при убывании вернуть нижний, если при возрастании, вернуть более высокий. Что касается части алгоритма сортировки, вы можете использовать пузырьковую сортировку. Это самый простой способ, но он медленный, поэтому, если это нужно быстро, я бы порекомендовал уделить время анализу слияния. В любом случае надеюсь, что это поможет. Если вам нужна помощь в исправлении метода сортировки или любви, вам кажется, что вы неплохой программист:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...