2013-03-20 80 views
0

我有三個arrays。他們是生日剩餘天象下面這樣:如何以相同的方式改變NSMutable數組的順序

name       birthdate     remaining 

    "Abhi Shah",     "01/14",     300 
    "Akash Parikh",    "12/09/1989",    264 
    "Anand Kapadiya",   "12/01",     256 
    "Annabella Faith Perez",  "03/02",     347 
    "Aysu Can",     "04/14/1992",    25 
    "Chirag Pandya"    "10/07/1987"    201 

我要重新排列的剩餘array升序排列, 但同時生日也應該以相同的方式重新排序。

見下面這個例子:

name       birthdate     remaining 

    "Aysu Can",     "04/14/1992",    25 
    "Chirag Pandya"    "10/07/1987"    201 
    "etc..." 
+2

這就是所謂的** **的對象 - 面向有原因的編程;-)創建一個擁有這3個變量並擺脫多重數組重排序混亂的對象。 – 2013-03-20 07:01:23

回答

2
self.arrayForRows = [[NSMutableArray alloc]init]; 
    NSMutableArray *arrayForNames = [[NSMutableArray alloc]initWithObjects:@"Abhi Shah",@"Akash",@"Nagavendra",@"Ramana",@"Simhachalam", nil]; 
    NSMutableArray *arrayForBirthDates = [[NSMutableArray alloc]initWithObjects:@"01/14/94",@"01/14",@"11/07/87",@"12/07/89",@"23/08/91", nil]; 
    NSMutableArray *arrayForRemaining = [[NSMutableArray alloc]initWithObjects:@"200",@"320",@"32",@"450",@"14", nil]; 


    for (int i=0; i<arrayForBirthDates.count; i++) 
    { 
     NSMutableDictionary *tempDicts = [[NSMutableDictionary alloc]init]; 
     [tempDicts setObject:[arrayForNames objectAtIndex:i] forKey:@"names"]; 
     [tempDicts setObject:[arrayForBirthDates objectAtIndex:i] forKey:@"birth"]; 
     [tempDicts setObject:[NSNumber numberWithInt:[[arrayForRemaining objectAtIndex:i] intValue]] forKey:@"remaining"]; 
     [self.arrayForRows addObject:tempDicts]; 
    } 


    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"remaining" ascending:YES]; 
    [self.arrayForRows sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

中的tableView上市使用此

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [self.arrayForRows count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifer = @"cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifer]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifer]; 
    } 
    cell.textLabel.text = [[self.arrayForRows objectAtIndex:indexPath.row] valueForKey:@"names"]; 
    return cell; 
} 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 
+0

dic得到創建,但它不與NSSortDEscriptor排序什麼是錯的? – user2189388 2013-03-20 10:54:29

+0

它對我很好。您在cellForRowAtIndexpath方法中如何訪問?你能告訴我嗎?,看到我編輯的答案 – 2013-03-20 10:56:03

+0

CellForRowAtIndexPath是後來的事情,當我NSLOG arrayForRows後,你的代碼然後仍然是它的樣子,DIC數組沒有按升序排列 – user2189388 2013-03-20 10:58:37

1

把每一行到詞典,進出這些字典到一個數組。然後使用謂詞或排序塊排序。如果你想要一個僅包含例如分類名稱的數組,你可以使用[ array valueForKeyPath:@"name" ]

陣列的樣子:

[ 
    { @"name" : ..., 
     @"birthdate" : ...birthdate..., 
     @"remaining" : ...days remaining... } , 
    {...}, 
    {...} 
] 
1

如您MutableArrayDictionarys array,您可以使用sortUsingComparator 到數組排序

[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 

    int a = [(NSNumber *)[(NSDictionary *)obj1 objectiveForKey: @"remanning"] intValue]; 
    int b = [(NSNumber *)[(NSDictionary *)obj2 objectiveForKey: @"remanning"] intValue]; 

    if (a < b) { 
     return NSOrderedAscending; 
    } 
    else if(a == b) 
    { 
     return NSOrderedSame; 
    } 
    return NSOrderedDescending; 
}]; 

例如,我有一個測試:

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@(30),@(20),@(5),@(100), nil]; 

[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 

    int a = [(NSNumber *)obj1 intValue]; 
    int b = [(NSNumber *)obj2 intValue]; 

    if (a < b) { 
     return NSOrderedAscending; 
    } 
    else if(a == b) 
    { 
     return NSOrderedSame; 
    } 
    return NSOrderedDescending; 
}]; 

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    NSLog(@"%@ , %d",obj,idx); 
}]; 

那麼輸出是: enter image description here

+0

怎麼樣的名字和生日排列他們將如何改變相同的方式改變發生在數組中? – user2189388 2013-03-20 07:08:12

+0

@ user2189388你應該讓一個人是一個'Dictionary'或'Class',比如'persion1 = [NSDictionary dictionaryWithObjectsAndKeys:@「Abhi Shah」,@「01/14」,@(300),@「names」 ,@「birthdate」,@「remanning」,nil];''array = [NSMutableArray arrayWithObjects:persion1,persion2,persion3,...,nil]' – 2013-03-20 07:16:37

3

使用NSMutableDictionary將數據存儲到NSMutableArray

NSMutableArray *array=[[NSMutableArray alloc]init]; 
for (int i=0; i<totalRows; i++) 
{ 
     NSMutableDictionary *dic=[[NSMutableDictionary alloc]init]; 
     [dic setValue:[array_1 objectAtIndex:i] forKey:@"names"]; 
     [dic setValue:[array_2 objectAtIndex:i] forKey:@"birthdate "]; 
     [dic setValue:[array_3 objectAtIndex:i] forKey:@"remanning"]; 
     [array addObject:dic]; 
     [dic release]; 
} 

這裏你安排名數組,使用搜索選項使用名稱不使用索引和 使用NSPredicate搜索數據後在NSMutableArray

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"names matches[cd] %@", name]; 
NSArray *result = [array filteredArrayUsingPredicate:predicate]; 
NSMutableDictionary *dict = [[[result objectAtIndex:0] mutableCopy] autorelease]; 
NSLog(@"%@",dict);// result 
+0

我不理解這個謂詞,你會解釋它將如何排序? – user2189388 2013-03-20 10:48:00

+0

它不排序數組它得到特定的dic在數組中,您只排序名稱數組,使用排序的名稱數組和使用謂詞來獲得數組中的特定名稱的詳細信息 – NANNAV 2013-03-20 10:53:50

+0

[NSPredicate predicateWithFormat:@「names matches [cd]%@」,name] ;這裏的名字是一個鍵和名字是搜索用戶名 – NANNAV 2013-03-20 10:54:26

2

一次嘗試這樣it'l幫助你,

NSMutableDictionary *dict=[[NSMutableDictionary alloc]init]; 
    [dict setObject:@"rahul" forKey:@"name"]; 
    [dict setObject:@"10" forKey:@"value"]; 
    NSMutableDictionary *dict1=[[NSMutableDictionary alloc]init]; 
    [dict1 setObject:@"ttt" forKey:@"name"]; 
    [dict1 setObject:@"6" forKey:@"value"]; 

    NSMutableArray *ar=[[NSMutableArray alloc]init]; 
    [ar addObject:dict]; 
    [ar addObject:dict1]; 

    NSSortDescriptor *Sorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; 
    [ar sortUsingDescriptors:[NSArray arrayWithObject:Sorter]]; 
    NSLog(@"---%@",ar);