2013-08-14 2 views
1

Я пытаюсь разобраться в большой ассортименте продукции по цене первых затем по названию, а затем отобразить их:применение два сортировки не работает должным образом

Применения как сортировка не похож на работу, ОДНАКО, применяя один их сортировка работает нормально, поэтому, если я применил сортировку по цене, она вернет продукты, отсортированные по цене, то же самое для названия. Так почему я не могу сортировать как по цене, так и по названию?

//Sort by Price, then by Title. Both Ascending orders 
arrayProduct = (NSMutableArray*)[arrayProduct sortedArrayUsingFunction:priceComparator context:nil]; 
arrayProduct = (NSMutableArray*)[arrayProduct sortedArrayUsingFunction:titleComparator context:nil]; 


//products comparators 
NSInteger priceComparator(NSMutableDictionary *obj1, NSMutableDictionary *obj2, void *context){ 


    int v1 = [[[obj1 valueForKey:@"Product Sale Price"]substringFromIndex:1] intValue]; 
    int v2 = [[[obj2 valueForKey:@"Product Sale Price"]substringFromIndex:1] intValue]; 

    if (v1 < v2){ 

     return NSOrderedAscending; 
    } 
    else if (v1 > v2){ 

     return NSOrderedDescending; 

    } 
    else 
     return NSOrderedSame; 

} 

NSInteger titleComparator(NSMutableDictionary *obj1, NSMutableDictionary *obj2, void *context){ 

    NSString* v1 = [obj1 valueForKey:@"Product Title"]; 
    NSString* v2 = [obj2 valueForKey:@"Product Title"]; 

    if ([v1 caseInsensitiveCompare:v2] == NSOrderedAscending){ 

     return NSOrderedAscending; 
    } 
    else if ([v1 caseInsensitiveCompare:v2] == NSOrderedDescending){ 

     return NSOrderedDescending; 
    } 
    else 
     return NSOrderedSame; 

} 
+0

Я не верю, что 'sortedArrayUsingFunction: контекст:' гарантирует сохранение любой «вторичное» упорядочение элементы. Из документов: «Возвращает новый массив, который перечисляет элементы принимающего массива в порядке возрастания, как определено компаратором сравнения». –

+0

Итак, что было бы лучшим способом сортировать массив по двум параметрам (цена тогда название)? – Malloc

+0

Попробуйте что-то вроде этого: http://stackoverflow.com/questions/10142974/sorting-arrays-in-objective-c –

ответ

9

Вы получаете неправильные результаты, потому что вы сортируете весь массив дважды. Вот некоторые другие варианты:

Вы можете использовать блоки

[arrayProduct sortUsingComparator:^NSComparisonResult(id a, id b) { 
    NSMutableDictionary * dictA = (NSMutableDictionary*)a; 
    NSMutableDictionary * dictB = (NSMutableDictionary*)b; 

    NSInteger p1 = [[[dictA valueForKey:@"Product Sale Price"]substringFromIndex:1] integerValue]; 
    NSInteger p2 = [[[dictB valueForKey:@"Product Sale Price"]substringFromIndex:1] integerValue]; 

    if(p1 > p2){ 
     return NSOrderedAscending; 
    } 
    else if(p2 > p1){ 
     return NSOrderedDescending; 
    } 
    //Break ties with product titles 
    NSString* v1 = [dictA valueForKey:@"Product Title"]; 
    NSString* v2 = [dictB valueForKey:@"Product Title"]; 

    return [v1 caseInsensitiveCompare:v2]; 
}]; 

Или NSSortDescriptors (http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/SortDescriptors/Articles/Creating.html)

+0

Hi iKaver, вы проверили образец выше? он корректно не сортирует – Malloc

+0

Hi Malloc, я забыл упомянуть в примере, что массив arrayProduct не сортируется, возвращая отсортированный массив. Я отредактирую код, чтобы уточнить. – ikaver

+0

Я изменил его, поэтому сам массив сортируется. Дайте мне знать, если это решит вашу проблему :) – ikaver

1

Я думаю, что проблема здесь в том, что вы когда-то сортировка по цене, а затем прибегнув весь массив по названию, перезаписывать любую сортировку, проделанную в первом раунде. Кажется, что вам нужен массив, отсортированный по цене, и если цена для двух или более позиций одинакова, это подмножество будет отсортировано по названию. Чтобы сделать это, вы должны сортировать только один раз и, следовательно, иметь только одну функцию Comparator. Вам, по сути, нужно объединить два, которые у вас есть. Сначала используйте логику для цен, но если v1 == v2, то используйте логику для названий.

+0

Привет, я уже получил это и попытался объединить обе сортировки точно так же, как вы сказали. Но это не принесло мне желаемых результатов. – Malloc

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