【问题标题】:how to change order of NSMutable array in same way another mutable arrays get changed如何以相同的方式更改 NSMutablearray 的顺序另一个可变数组被更改
【发布时间】:2013-03-20 06:46:36
【问题描述】:

我有三个arrays。它们是姓名生日剩余天,如下所示:

    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 重新排列为升序, 但同时 namebirthdate 也应该以同样的方式重新排序。

请参阅下面的示例:

    name                         birthdate                 remaining 

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

【问题讨论】:

  • 它被称为面向对象的编程是有原因的 ;-) 创建一个包含这 3 个变量的对象并摆脱多数组重新排序的混乱。

标签: ios sorting nsmutablearray nsmutabledictionary


【解决方案1】:

使用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];
 }

在您安排名称数组后,使用搜索选项使用名称而不是使用索引和 使用NSPredicateNSMutableArray中搜索数据

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

【讨论】:

  • 我不明白这个谓词你能解释一下它是如何排序的吗?
  • 它不对数组进行排序它在数组中得到特定的 dic,你只对名称数组进行排序,使用排序的名称数组并使用谓词来获取数组中的特定名称详细信息
  • [NSPredicate predicateWithFormat:@"名称匹配[cd] %@", name];这里的名字是一个键,名字是搜索用户名
【解决方案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;
}

【讨论】:

  • dic 已创建,但它没有使用 NSSortDEscriptor 进行排序,这是怎么回事?
  • 它对我来说很好用。您如何在 cellForRowAtIndexpath 方法中访问?你能告诉我吗?,看看我编辑的答案
  • CellForRowAtIndexPath 是稍后的事情,当我在你的代码之后 NSLOG arrayForRows 然后它仍然保持原样,dic 数组没有按升序排序
  • 我做得很好。您只是复制并粘贴我的代码并尝试了??
  • 明白你的意思..现在检查我是否更新了代码..它会正常工作
【解决方案3】:

一旦尝试这样它会帮助你,

 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);

【讨论】:

    【解决方案4】:

    将每一行放入一个字典中,然后将这些字典放入一个数组中。然后使用谓词或排序块对您进行排序。例如,如果您想要一个仅包含排序名称的数组,您可以使用 [ array valueForKeyPath:@"name" ]

    数组看起来像:

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

    【讨论】:

      【解决方案5】:

      比如你的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);
      }];
      

      那么输出是:

      【讨论】:

      • 姓名和生日数组如何以与保持数组中发生的更改相同的方式更改?
      • @user2189388 你应该让一个人是DictionaryClass 比如persion1 = [NSDictionary dictionaryWithObjectsAndKeys:@"Abhi Shah",@"01/14",@(300),@"names",@"birthdate",@"remanning", nil];array = [NSMutableArray arrayWithObjects:persion1,persion2,persion3,..., nil]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多