2013-07-20 2 views
4

Я создал NSMutableArray Объекта с помощью этого кодаКак сортировать NSMutableArray объекта в порядке возрастания или убывания

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSArray * ary1 = [NSArray arrayWithObjects:@"01/07",@"02/07",@"03/07",@"04/07",@"05/07",@"06/07",@"07/07", nil]; 
     NSArray * ary2 = [NSArray arrayWithObjects:@"First",@"Second",@"Third",@"Forth",@"Fifth",@"Sixth",@"Seventh", nil]; 
     NSArray * ary3 = [NSArray arrayWithObjects:@"1000",@"2000",@"3000",@"4000",@"5000",@"6000",@"7000", nil]; 

tableAry = [[NSMutableArray alloc] init]; 
     for (int i=0; i<ary1.count; i++) { 
      //cardSummry will hold the data and give back the model to store in array and we can find that value using model 
      DataModel *dataModel = [[DataModel alloc] init]; 
      dataModel.date = [ary1 objectAtIndex:i]; 
      dataModel.name = [ary2 objectAtIndex:i]; 
      dataModel.ammount = [ary3 objectAtIndex:i]; 

      [tableAry addObject:dataModel]; 
     } 
} 

И это мой DataModel Класс

.H файл

#import <Foundation/Foundation.h> 

@interface DataModel : NSObject 

//this variable is used to get the data from array 
@property (nonatomic,strong) NSString *date; 
@property (nonatomic,strong) NSString *name; 
@property (nonatomic,strong) NSString *ammount; 

//this method will genarate a data model which will be added to array for future use 
+ (id)cardSummary:(NSString*)date name:(NSString*)name ammount:(NSString*)ammount; 
@end 

. M файл

#import "DataModel.h" 

@implementation DataModel 

@synthesize date,name,ammount; 

//this method will genarate a data model which will be added to array for future use 
+ (id)cardSummary:(NSString*)date name:(NSString*)name ammount:(NSString*)ammount 
{ 
    DataModel *dataModel = [[self alloc] init]; 

    [dataModel setDate:date]; 
    [dataModel setAmmount:ammount]; 
    [dataModel setName:name]; 

    return dataModel; 
} 

@end 

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

[tableAry sortUsingDescriptors: 
    [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]]]; 

    NSLog(@"tableAry : %@",tableAry); 

Так как я могу сортировать мой массив

Update

как @Martin R И @Rick сказал я есть Alloc мой массив, но теперь я получил эту ошибку.

*** Нагрузочное приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: '- [DataModel caseInsensitiveCompare]: непризнанный селектор направил к экземпляру 0x7550850'

+0

Если 'NSLog (@ "tableAry:% @", tableAry);' показывает 'NULL', тогда вы забыли выделить + init' tableAry'. –

+0

Во-первых, исправьте свой заголовок, должен быть «сортирован». Затем попробуйте добавить 'tableAry = [NSMutableArray array];' перед циклом for в viewDidLoad. Вы должны инициализировать NSMutableArray перед добавлением к нему объектов. – Rick

+0

@MartinR см. Мое обновление. Я выделил свой массив, но столкнулся со второй ошибкой. –

ответ

2
[tableAry sortUsingComparator:^NSComparisonResult(DataModel *obj1, DataModel *obj2) { 
     return [obj1.name caseInsensitiveCompare:obj2.name]; 
}]; 
+0

Ваш код верный, но код в вопросе должен работать. –

+0

Помог мне, отличная работа :) –

3

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

NSSortDescriptor* sortDes = [[NSSortDescriptor alloc] initWithKey:@"your key" ascending:YES]; 
[_array sortUsingDescriptors:[NSArray arrayWithObject:sortDes]]; 

Попробуйте.

+0

Похоже, ваша проблема решена. – gohamgx

0
-(NSMutableArray*)shortCardInAssendingOrder:(NSMutableArray*)cardSetArr{ 
    NSMutableArray *shortedArray=[[NSMutableArray alloc]init]; 
    for (int i=0; i<=[cardSetArr count]+1; i++) { 
     Card *firstCard=[cardSetArr objectAtIndex:0]; 
     for(int j=0; j<[cardSetArr count]; j++){ 
      Card *nextCard=[cardSetArr objectAtIndex:j]; 
      if(firstCard.cardSymbol>nextCard.cardSymbol){ 
       firstCard=nil; 
       firstCard=nextCard; 
      } 
     } 
     [shortedArray addObject:firstCard]; 
     [cardSetArr removeObject:firstCard]; 
    } 
    [shortedArray addObject:[cardSetArr objectAtIndex:0]]; 
    return shortedArray; 
} 

Примечание: вы можете использовать ур тег или любую вещь еще в тха месте cardSymbol

+0

Как вы используете> знак для NSString? DOWNVOTE –

1
-(NSMutableArray*)sortArrayInAssendingOrder:(NSMutableArray*)array{ // array must have numerical value 
NSMutableArray *newArray=[NSMutableArray arrayWithArray: array]; 
NSMutableArray *shortedArray=[[NSMutableArray alloc]init]; 
for (int i=0; i<=[newArray count]+1; i++) { 
    NSInteger value_1=[[newArray objectAtIndex:0]integerValue]; 
    for(int j=0; j<[newArray count]; j++){ 
     NSInteger value_2=[[newArray objectAtIndex:j]integerValue]; 
     if(value_1>value_2){ 
      value_1 =nil; 
      value_1 = value_2; 
     } 
    } 
    [shortedArray addObject:value_1]; 
    [newArray removeObject: value_1]; 
} 
    [shortedArray addObject:[newArray objectAtIndex:0]]; 

return shortedArray; 

}

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