2014-01-17 3 views
1

Я рассмотрел некоторые вопросы, такие как Sort NSDates inside NSDictionary inside NSArray?, которые объясняют, как сортировать массив словарей. Но я не нашел объяснения того, как блок NSComparator действительно работает, и мне действительно интересно.Что происходит за кулисами в блоке NSComparator?

Пример кода (сверху-сшитый Q)

NSComparator sortByDate = ^(id dict1, id dict2) { 
    NSDate* n1 = [dict1 objectForKey:@"Date"]; 
    NSDate* n2 = [dict2 objectForKey:@"Date"]; 
    return [n1 compare:n2]; 
}; 

[self.cellArray sortUsingComparator:sortByDate]; 

Где два входа блока поступают из? Как итерация, которая должна потребоваться для сортировки коллекции, вступает в игру? И т.д. Спасибо!

ответ

4

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

В основе этого метода сортировки вы будете сравнивать два элемента, чтобы увидеть, какой из них нужно заказать выше, чем другой. Но поскольку вы пишете общий метод сортировки, вы не знаете, как нужно сортировать фактические объекты. Таким образом, вы оставите фактический метод сравнения с человеком, который действительно хочет использовать ваш метод, и они будут предоставлять этот метод в блоке. Итак, вы должны написать свой метод примерно так.

- (NSArray *)mySortMethodUsingBlock:(NSComparator(^)(id obj1, id obj2))comparator { 
    // Keep repeating these steps til the array is sorted: 
    // Some methods to walk the array get two elements to examine 
    // Pass these two objects to the block that the user has provided and get their order 
    NSComparator result = comparator (anObj, anotherObj); 
    // Use the result to determine how the objects are positioned 

    // Return the sorted array. 
} 

So. Когда вы создаете блок компаратора, вы просто указываете метод сравнения двух объектов. Затем метод может позаботиться об использовании этой информации для эффективного сортировки массива.

+0

А, я вижу, метод sortUsingComparator выполняет все «за кулисами», а компаратор просто поставляет именно то, что подразумевает его название. Имеет смысл. благодаря – mkc842

1

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

Смежные вопросы