2013-03-13 79 views
2

我正在使用以下NSSortDescriptor代码对数组进行排序。我目前正按价格排序,但也想限制价格。是否可以按价格分类,但只能显示价格低于100的例子?如何使用NSSortDescriptor对NSMutableArray进行排序

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
             initWithKey: @"price" ascending: YES]; 

NSMutableArray *sortedArray = (NSMutableArray *)[self.displayItems 
                sortedArrayUsingDescriptors: [NSArray arrayWithObject:sortDescriptor]]; 

[self setDisplayItems:sortedArray]; 

[self.tableView reloadData]; 
+0

你不能只将'NSArray'投射到'NSMutableArray'。使用'[array mutableCopy]' – Sebastian 2013-03-13 10:43:10

+0

塞巴斯蒂安是对的。一个NSArray将永远是一个NSArray,只要它是一个子类的成员,在这种情况下,它总是该子类的成员。 – moonman239 2015-08-19 19:59:50

回答

9

您需要过滤以及排序数组。

保持你原来的代码结构,你可以添加一个过滤器是这样的:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
            initWithKey: @"price" ascending: YES]; 

NSArray *sortedArray = [self.displayItems sortedArrayUsingDescriptors: [NSArray arrayWithObject:sortDescriptor]]; 

NSPredicate *pred = [NSPredicate predicateWithFormat: @"price < 100"]; 
NSMutableArray *filteredAndSortedArray = [sortedArray filteredArrayUsingPredicate: pred]; 

[self setDisplayItems: [filteredAndSortedArray mutableCopy]]; 

[self.tableView reloadData]; 

如果性能成为一个问题,你可能要逆过滤和排序,但是这是一个细节。

0
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"your key" ascending:true]; 
[yourarray sortUsingDescriptors:[NSArray arrayWithObject:sorter]]; 
[sorter release]; 
+0

谢谢,但是我不是那样的吗?我不仅需要对价格(我的钥匙)进行分类,而且如果它<= 100等,也只能显示价格... – hanumanDev 2013-03-13 10:37:30

+0

为什么要降级? NSSortDescriptor仅用于对数组进行排序。如果您想设置价格的限制,请使用NSPredicate。 – Girish 2013-03-13 10:40:39

+0

Downvote,因为你没有回答这个问题。 – Sebastian 2013-03-13 10:42:18

1

可以先阵列具有指定范围过滤在价格,则排序后的数组排序的过滤阵列&显示在tableview中!!!

为了滤除,您可以使用NSPredicate &进行排序,你可以使用相同的NSSortDescriptor

希望这可以帮助你!

0
NSMutableArray * weekDays = [[NSMutableArray alloc] initWithObjects:@"Sunday",@"Monday",@"Tuesday",@"Wednesday",@"Thursday",@"Friday",@"Saturday", nil]; 
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
NSMutableArray *dictArray = [[NSMutableArray alloc] init]; 

for(int i = 0; i < [weekDays count]; i++) 
{ 
    dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%i",i],@"WeekDay",[weekDays objectAtIndex:i],@"Name",nil]; 
    [dictArray addObject:dict]; 
} 
NSLog(@"Before Sorting : %@",dictArray); 

@try 
{ 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:NO]; 
    NSArray *descriptor = @[sortDescriptor]; 
    NSArray *sortedArray = [dictArray sortedArrayUsingDescriptors:descriptor]; 
    NSLog(@"After Sorting : %@",sortedArray); 
} 
@catch (NSException *exception) 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Sorting cant be done because of some error" message:[NSString stringWithFormat:@"%@",exception] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
    [alert setTag:500]; 
    [alert show]; 
    [alert release]; 
} 
相关问题