У меня есть NSArray на NSString, но некоторые строки являются только числами. Как правильно отсортировать по количеству? - PullRequest
2 голосов
/ 11 сентября 2011

Мой NSArray содержит 100, 110, 91, 98 и 87, все строки NSS.

Я бы хотел отсортировать их по порядку: 87, 91, 98, 100, 110.

Вместо этого они отображаются как 100, 110, 87, 91, 98.

К сожалению, я не могу запустить массив со всеми целыми числами вместо строк. У кого-нибудь есть идеи о том, как определить, содержит ли массив ТОЛЬКО числа из строк, возможно, используя цикл for? Тогда я мог бы просто преобразовать их в целые числа в массиве и выполнить сортировку таким образом. А может, есть простой способ, которого мне не хватает?

Дайте мне знать, если у кого-нибудь есть идеи.

Ответы [ 2 ]

6 голосов
/ 11 сентября 2011

Вы можете использовать опцию NSNumericSearch для функции сравнения NSString для числовой сортировки строк.Чтобы сделать это с NSArray, вам нужно написать блок или функцию для вызова метода compare:options:.

NSArray *theStrings; // Contains strings, some of which are numbers
NSArray *theSortedStrings = [theStrings sortedArrayUsingComparator:^(id obj1, id obj2) {
    return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch];
}];

Это также будет выполнять числовую сортировку, если в строке есть число, т. Е. "abcd89" придет раньше "abcd123".

1 голос
/ 11 сентября 2011

Есть целый ряд вариантов сортировки массива ; это на самом деле не проблема.

Методы сортировки всегда приводят объекты в порядок. Заказ зависит от объектов или от вас.

Итак, что вам нужно сделать, это одно из следующих действий:

  1. Получить строки, чтобы сравнить себя численно.
  2. Получить массив, чтобы попросить вас сравнить их, а затем сравнить их численно.

Дверь номер один - это трюк с половиной. NSString и другие кластеры классов не позволяют вам наследовать реализации; Вы можете создать свой собственный строковый класс, но в основном вам нужно будет делать все с нуля (или заключить строку в строку и переслать каждое сообщение, кроме compare:).

Дверь номер два намного проще. Почти каждый из методов сортировки принимает либо блок, либо функцию, которую вы реализуете; в любом случае, блок / функция берет два объекта из массива, сравнивает их и возвращает порядок, в котором они находятся.

Ваш блок / функция должен отправить a compare:options: сообщение одной из двух полученных строк, передав параметр NSNumericSearch и вернуть результат.

Если NSArray спросит вас, как сравниваются строки, а вы спросите строки, как они сравниваются численно, массив затем отсортирует свои объекты в числовом порядке.

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