2013-06-27 3 views
0

У меня есть набор словарей, как показано ниже.Как изменить порядок массивов словарей в соответствии с произвольным порядком ключей/атрибутов (ни восходящий, ни нисходящий)

NSMutableArray *newArray 
({ 
    { 
     A = John; 
     B = THAILAND; 
    }, 
    { 
     A = Jack; 
     B = US; 
    } 
    { 
     A = Lee; 
     B = BRAZIL; 
    } 
    { 
     A = Brandon; 
     B = UK; 
    } 
    { 
     A = Jill; 
     B = JAPAN; 
    } 
    { 
     A = Johnny; 
     B = UK; 
    } 
    { 
     A = Amar; 
     B = AUSTRALIA; 
    } 
}) 

Я хочу, чтобы изменить порядок выше массив на основе другого массива (Key B из newArray), который является

NSArray *sortArray = [[NSArray alloc] initWithObjects"US",@"UK",nil]; 

Это означает, что мой последний массив должен содержать значение первого следует Великобритания следует США отдых. Вкратце, как я могу установить собственный заказ для атрибута/ключа в массиве.

Как я могу это сделать?

Ожидаемый результат:

NSMutableArray *finalArray 
({ 
    { 
     A = Jack; 
     B = US; 
    }, 
    { 
     A = Brandon; 
     B = UK; 
    } 
    { 
     A = Johnny; 
     B = UK; 
    } 
    { 
     A = John; 
     B = THAILAND; 
    } 
    { 
     A = Lee; 
     B = BRAZIL; 
    } 
    { 
     A = Jill; 
     B = JAPAN; 
    } 
    { 
     A = Amar; 
     B = AUSTRALIA; 
    } 
}) 

Я попытался следующий код, который дает мне порядке возрастания ключа B.

[newArray sortUsingDescriptors:[NSArray arrayWithObjects: [[NSSortDescriptor alloc] initWithKey:@"B" ascending:YES], nil]]; 

ответ

0

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

NSMutableArray *filterArray = [[NSMutableArray alloc] init]; 
     NSArray *sortArray = [[NSArray alloc] initWithObjects:@"US",@"UK",@"THAILAND",@"BRAZIL",@"JAPAN",@"AUSTRALIA",nil]; // Array containing all the distinct value for the key 'Currency' in self defined order (neither descending nor ascending order). 
     NSPredicate *predCurrency = nil; 
     // Creating the predicate for individual objects in the sortArray and appending it to the filterArray. 
     for (int i = 0; i < [sortArray count]; i++) { 
      predCurrency = [NSPredicate predicateWithFormat:@"(NEW_KEY_22 contains[cd] %@)",[sortArray objectAtIndex:i]]; 
      [filterArray addObjectsFromArray:[myNewArray filteredArrayUsingPredicate:predCurrency]]; 
     } 
     NSLog(@"%@",filterArray); 
     // Finally setting the filterArray to the array controller. 
     [commercialArrayController addObjects:filterArray];  // This gives the resultant array having the defined order in sortArray. 
0

вы, вероятно, придется сделать что-то вроде:

[newArray sortUsingComparator: 
    ^NSComparisonResult (id a, id b) 
    { 
     NSUInteger indexOfA = [sortArray indexOfObject:[a objectForKey:@"B"]]; 
     NSUinteger indexOfB = ...same thing for b...; 

     return [@(indexOfA) compare:@(indexOfB)]; 
    }]; 

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

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

+0

Что мне нужно передать в аргументах a и b вышеприведенному блоку в моем примере? – user2181174

+0

Извинения, я добавил в код немного больше мяса - 'sortUsingComparator:' - метод в 'NSMutableArray'; он будет поставлять пары объектов из массива в ваш компаратор в любом порядке, чтобы определить порядок массива. – Tommy