2013-03-10 2 views
0

У меня есть NSMutableDictionary, который содержит ключи, которые являются NSString s, и значениями, которые являются объектами типа «Фракция». Это настраиваемый объект, который я создал, и это именно то, что он есть, фракции, состоящие из числителя и знаменатель (каждый из них является int). То, что я хотел бы сделать, это получить массив значений (в данном случае, «доля» объектов) из NSMutableDictionary, а затем отсортировать массив, используя @selector следующим образом:Попытка сортировать NSMutableDictionary по значениям с помощью @selector в iOS

NSArray *myFractions = [myDict allValues]; 
NSArray *sortedFractions = [myFractions sortedArrayUsingSelector:@selector(comparator)]; 

или

NSArray *myFractions = [myDict allValues]; 
NSArray *sortedFractions = [myFractions sortedArrayUsingFunction:comparatorFunction context:nil]; 

Мой вопрос в том, как мне создать метод comparatorFunction, который будет сортировать объекты «Fraction» в порядке наибольшего, наименьшего? Помните, что каждый объект «Фракция» состоит из двух переменных: числителя типа int и знаменателя, который также имеет тип int.

Этот вопрос отличается от других, которые были опубликованы, потому что здесь я спрашиваю о том, как в методе «sortedArrayUsingFunction» я должен сортировать объекты «Фракция» от максимального до наименьшего. Другие вопросы, которые считались дубликатами, рассматривали сортировку на основе объектов NSDate или на основе значений NSString, тогда как мои разные. Как я уже сказал, я очень новичок в этом и нуждаюсь в чем-то более конкретном.

Заранее спасибо.

ответ

0

В стилистического совершенствования, я могу предложить вам использовать замыкание вместо функция? Чтобы отсортировать объекты в порядке убывания, просто сравнить их фактическое числовое значение, например:

NSMutableDictionary *dict = // dictionary of NSString keys and Fraction values 
NSArray *fractions = [dict allValues]; 

NSArray *sortedFractions = [fractions sortedArrayUsingComparator:^(id obj1, id obj2) { 
    Fraction *f1 = obj1; 
    Fraction *f2 = obj2; 
    double diff = (double)(f1.num)/f1.denom - (double)(f2.num)/f2.denom; 
    return diff < 0 ? NSOrderedAscending : diff > 0 ? NSOrderedDescending : NSOrderedSame; 
}]; 
+0

Спасибо за ваш быстрый ответ. Должен ли он [dict allValues] вместо [dict allObjects]? – syedfa

+0

@syedfa Это обязательно должно быть. – 2013-03-10 11:08:16

+0

Большое спасибо BiCarbonate, ваше решение сработало! – syedfa

0

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

-(NSComparisonResult)compareFirstName:(Fraction *)fraction{ 

     return ((float)self.numerator/self.denominator > (float)fraction.numerator/fraction.denominator); 
} 

* Не компилируется и проверил

+0

Что те вызовы на 'objectAtIndex:' и 'сравнения:' на 'float'? – 2013-03-10 10:14:12

+0

oops он должен быть напрямую> или <, я пропустил, что это примитив :( –

+0

@AnoopVaidyia Все еще, что такое 'objectAtIndex:' там? – 2013-03-10 10:17:16

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