Сортировка NSArray на основе других массивов с пользовательскими классами - PullRequest
2 голосов
/ 11 февраля 2012

Мне отчаянно нужно отсортировать массив: вот ситуация,

Мне нужно переставить / отсортировать и заменить массивы на основе другого класса объектов из другого массива.

ParentClass :NSObject{
  NSString *name;
  NSNumber *type;
}

Это родительский класс, который заполняет parentArray

parentArray = { parentA, parentB, parentC }

Это еще один объектный класс, у него есть ParentClass * parent.

@class ParentClass;

EntryClass: NSObject{
 NSString *name;
 NSNumber *number;
 ParentClass *parent;
}



Now I have an array entryArray = { entryX, entryY, entryZ };

entryX.parent is one of the ParentClasses and all of them are in parentArray.

entryX.parent  == ParentC;
entryY.parent  == ParentA;
entryZ.parent  == ParentB;

Я хочу отсортировать этот entryArray в соответствии с последовательностью в parentArray. Так что если ParentArray равен:

{
 ParentA,
 ParentB,
 ParentC
}

тогда я бы хотел, чтобы отсортированный entryArray был

{
 entryY,
 entryZ,
 entryX
}

Кроме того, если отсутствует одна запись Object, entryZ, то массив должен быть

{
 entryY,
 @"0.0",
 entryX
}

Если вы попробовали несколько способов, но ни один из них не сработал, любая помощь приветствуется.

спасибо

UPDATE: БОЛЬШЕ ЯСНОСТИ предположим, что parentArray находится в этой последовательности

{parentA, parentB}

, а массив записей находится в

{entryX, entryY}

, я хочу переставить entryArray и если

entryY.parent == parentA и entryX.parent == parentB

, затем, основываясь на их позициях в parentArray, где parentA будет первым, я бы хотел, чтобы entryY была до entryX result = {entryY, entryX}.

1 Ответ

6 голосов
/ 11 февраля 2012

На самом деле у вас есть «метод сортировки с использованием селектора» ( SO source ):

- (NSComparisonResult)compareParents:(EntryClass*)otherObject {
    return [parentArray indexOfObject:self.parent] < [parentArray indexOfObject:otherEntry.parent];
}

NSArray *sortedArray;
sortedArray = [entryArray sortedArrayUsingSelector:@selector(compareParents:)];

Делайте так, когда сортировка entryArray, compareParents используется какметод сравнения.Это означает, что e1 будет «меньше» e2, если e1.parent меньше, чем e2.parent.Это именно то, что вы хотите.

compareParents должен быть определен метод объявления EntryClass и parentArray должен быть видимым для него.

ОРИГИНАЛЬНЫЙ ОТВЕТ:

Я не уверен, что полностью понимаю, что вы пытаетесь сделать;в любом случае, я бы подошел к проблеме, используя словарь, в котором вы связываете каждого родителя с его записью.Таким образом, после того как ваш родительский массив отсортирован, вы можете выполнить итерацию и выяснить, какая запись является соответствующей, которая также будет (косвенно) отсортирована.

...