2015-06-11 3 views
1

У меня есть массив appd.arrOfDictAppProd, есть ключ Цена, который является строковым значением. Но я хочу сортировать этот массив по цене. Таким образом, я получаю ключ Price от appd.arrOfDictAppProd массив и конвертирует цену в строку в Int, затем создайте NSMutableArray newarray без каких-либо ключей. Я хочу отсортировать это с помощью NSSortDescriptor без использования каких-либо Ключ, потому что в моем newarray нет ключа. Мой код здесь:Сортировка массива с использованием NSSortDescriptor без использования какого-либо ключа?

for (int i = 0; i<appd.arrOfDictAppProd.count; i++) { 
    NSString *price_Value = [[appd.arrOfDictAppProd objectAtIndex:indexPath.row] objectForKey:@"price"]; 
    int price_IntValue = [price_Value intValue]; 
    NSLog(@"int value of prices:%d",price_IntValue); 

    NSNumber *num = [NSNumber numberWithInteger:price_IntValue]; 
    NSLog(@"number-%@",num); 
    [newarray addObject:num]; 

} 
NSLog(@"price array:%@",newarray); 

NSSortDescriptor *sortDescriptor; 
sortDescriptor =[[NSSortDescriptor alloc] initWithKey:@"num" 
                ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
NSArray *sortedArray1; 
sortedArray1 = [newarray sortedArrayUsingDescriptors:sortDescriptors]; 

Когда я запускаю свою программу, в newarray У меня есть 14 значений, но это то же самое, то есть 3.

+1

Исправьте цикл 'for'. Вы получаете один и тот же объект снова и снова, поэтому 'newArray' содержит 14 одинаковых значений. – rmaddy

+0

@rmaddy. можете ли вы сказать мне, как исправить для loop.plz help – RAMA

+0

Замените 'indexPath.row' на' i'. – rmaddy

ответ

3

Возможно, я пропустил этот пункт, но это звучит так, будто вы массово преувеличиваете вещи.

NSArray *sortedArray = [appd.arrOfDictAppProd sortedArrayUsingDescriptors: 
    @[ 
     [NSSortDescritptor sortDescriptorWithKey:@"price.intValue" ascending:YES] 
    ]]; 

Если вы хотите создать newarray независимо - или просто без вашего ручного контура - то идти с:

NSArray *newarray = [appd.arrOfDictAppProd valueForKeyPath:@"price.intValue"]; 

Механизм полагались на здесь кодирования ключ-значение. Я также основывался на том, как NSDictionary и NSArray реализуют кодирование с ключом.

-valueForKey: и -valueForKeyPath: предоставлены NSObject. Игнорируя особые случаи и резервные копии, объект будет отвечать первым, возвращая значение этого свойства в качестве объекта - среди прочего он автоматически преобразует встроенные числовые типы в NSNumber. Последний будет пересекать иерархии объектов, например, object.property1.property2 запросит object, а затем запросить property1 с object, а затем запросить property2 от property1.

Поэтому вы можете использовать [stringObject valueForKey:@"intValue"] для доступа к intValue собственности на stringObject и затем NSObject упаковать его в NSNumber.

NSDictionary имеет реализацию кодирования ключ-значение, которые будут смотреть в словарь для соответствующего значения, если это не начинается с префикса @ означает, что вы хотите получить информацию о словаре, не из словаря. Поскольку ваше ключевое имя - это строка, которая начинается не с @, valueForKey: поэтому заканчивается вызовом objectForKey:.

Поэтому дескриптор сортировки с ключом price.intValue в массиве словарей задает каждому словарю значение для ключа price.Словарь решит позвонить по телефону objectForKey:. Он вернет строку. Он назовет intValue на этой строке и получит обратно int. Затем он обернет это в NSNumber и сравните числа для всех словарей, чтобы решить порядок.

NSArray реализует valueForKey: и valueForKeyPath: путем вызова соответствующего метода по каждому элементу массива поочередно и затем возвращает массив, содержащий все эти результаты. Таким образом, вы можете использовать ключевое значение кодирования как способ сопоставления результатов в определенной степени.

+0

спасибо @ Tommy. ваш ответ очень прав. – RAMA

1

Поскольку newarray просто (измененный) массив NSNumber s и NSNumber реализует метод compare:, вы можете вызвать

[newarray sortArrayUsingComparator:@selector(compare:)]; 

сразу после для петли. Вам не нужны дескрипторы сортировки.

+0

Почему это поддерживается? Это не поможет. OP указывает, что 'newArray' содержит одно и то же число снова и снова. Изменение сортировки не поможет. Ошибка находится в цикле 'for'. – rmaddy

+0

@ rmaddy.sorry за опоздание на ответ. И мне нужна помощь прямо сейчас. – RAMA

+0

@ rmaddy..you are right.bug in For loop.. Я спрашиваю, как исправить For loop.Thanks – RAMA