отменить сортировку nsarray - PullRequest
1 голос
/ 06 марта 2012

Вот пример того, что я хочу сделать с NSArray, содержит NSNumber.

  1. Это "оценка" NSArray, которую я хочу отредактировать.
    оценка [0] = 30,
    оценка [1] = 10,
    оценка [2] = 20
    оценка [3] = 0

  2. Сортировка массива в порядке возрастания
    счет [0] = 30 // [0] Это число показывает индекс перед сортировкой массива
    оценка [1] = 20 // [2]
    оценка [2] = 10 // [1]
    оценка [3] = 0 // [3]

  3. Редактирование массива (в этом случае 4-й дает 1-е 10 баллов, а 3-й дает 2-е 5 баллов)
    оценка [0] = 40 // [0]
    оценка [1] = 25 // [2]
    оценка [2] = 5 // [1]
    оценка [3] = - 10 // [3]

  4. И отсортируйте массив обратно.
    оценка [0] = 40
    оценка [1] = 5
    оценка [2] = 25
    оценка [3] = - 10

    У меня проблема с методом № 4 в списке. Может кто-нибудь дать мне представление об этом?
    Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

На самом деле не нужно для замены самих значений, вы можете установить дополнительный уровень косвенности и использовать его.

Перед сортировкой индексы инициализируются какукажите на соответствующие баллы:

index[0] = 0      score[0] = 30
index[1] = 1      score[1] = 10
index[2] = 2      score[2] = 20
index[3] = 3      score[3] =  0

Когда вы сортируете, вы фактически сортируете индексы на основе баллов, на которые они указывают, а не самих баллов.Таким образом, вместо следующего сравнения в вашем роде:

if score[i] > score[i+1] then swap score[i], score[i+1]

вместо этого вы используете:

if score[index[i]] > score[index[i+1]] then swap index[i], index[i+1]

После сортировки вы получите:

index[0] = 0      score[0] = 30
index[1] = 2      score[1] = 10   \ These two indexes have been swapped
index[2] = 1      score[2] = 20   /   but NOT the scores.
index[3] = 3      score[3] =  0

Затем для перемещения точек вы используете косвенные индексы, а не прямые значения:

score[index[0]] += 10; score[index[3]] -= 10;
score[index[1]] +=  5; score[index[2]] -=  5;

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

0 голосов
/ 06 марта 2012

[Код будет введен, проверьте его!]

Я предполагаю, что ваш массив score действительно изменчив, поскольку вы намереваетесь его изменить:

NSMutableArray *score = ...;

Создайте другой массив того же размера и инициализируйте 0..n:

NSMutableArray *indices = [NSMutableArray arrayWithCapacity:[score count]];
// add the numbers 0..[score count] to indices

Теперь отсортируйте массив indices с помощью пользовательского компаратора, который ищет массив score:

[indices sortUsingComparator:(NSComparator)^(NSNumber *a, NSNumber *b)
 {
    return [((NSNumber *)[[score objectAtIndex:[a integerValue]])
            compare:[[score objectAtIndex:[b integerValue]]
           ];
 }
]

Теперь вы можете изменить исходный массив с помощью массива индексов, например, изменить 4-й элемент после источника:

[score replaceObjectAtIndex:[[indices objectAtIndex:3] integerValue] withObject:...];

Теперь вам вообще не нужно «сортировать» score, ваш шаг 4 - «ничего не делать».

0 голосов
/ 06 марта 2012

Сделать дополнительный массив инициализированным следующим образом:

index[0] = 0
index[1] = 1
index[2] = 2
:

И каждый раз, когда ваш алгоритм сортировки меняет два индекса на score, вы также меняете те же индексы на index.

В случае, если ваш алгоритм сортировки является встроенным, так что вы не можете его контролировать, вам придется заменить каждую оценку на кортеж (объект, массив из двух элементов, в зависимости от того, что проще в target-c) где элемент равен баллу, а другой элемент - его исходному индексу. При сортировке вы передаете пользовательский компаратор в функцию сортировки, так что для сравнения используется только оценка. Это позволит отсортировать ваши кортежи с индексами, чтобы вы могли использовать индекс для восстановления их в первоначальном порядке.

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