【问题标题】:NSArray sortUsingFunction custom object always at the endNSArray sortUsingFunction 自定义对象总是在最后
【发布时间】:2017-12-25 08:56:02
【问题描述】:

请帮忙。我有 NSArray,里面有自定义对象。例如 Person,因此名称为“Mark”的 Person 应始终位于末尾。是否可以在“sortUsingFunction”的帮助下做到这一点? 我猜是这样的,这里是排序函数:

static NSInteger compareFunction(id item1, id item2, void *context)
{
   Person *pItem1 = (Person *)item1;
   Person *pItem2 = (Person *)item2;

   if ([pItem1.name isEqual:@"Mark"])
   {
      return NSOrderedDescending;
   }
}

注意:应该是sortUsingFunction,没有其他函数。

【问题讨论】:

    标签: ios objective-c sorting nsarray


    【解决方案1】:

    是的,你的想法是可行的。这是一个经过测试的示例:

    NSArray *names = @[@"John",@"Mark",@"Sandy"];
    NSArray *markEndArray = [names sortedArrayUsingComparator:^NSComparisonResult(NSString *_Nonnull obj1, NSString *_Nonnull obj2) {
        if ([obj1 isEqualToString:@"Mark"]) {
            return NSOrderedDescending;
        }
    
        return [obj1 compare:obj2];
    }];
    
    NSLog(@"%@",markEndArray);
    
    //Output:    
        John,
        Sandy,
        Mark
    

    【讨论】:

      【解决方案2】:

      Yun CHEN 的版本不能完全运行。尝试使用以下名称失败:

      NSArray *names = @[
          @"John",
          @"Noah",
          @"Liam",
          @"Mason",
          @"Jacob",
          @"William",
          @"Ethan",
          @"James",
          @"Alexander",
          @"Michael",
          @"Mark",
          @"Benjamin",
          @"Elijah",
          @"Daniel",
          @"Aiden",
          @"Logan",
          @"Matthew",
          @"Lucas",
          @"Jackson",
          @"David",
          @"Oliver",
          @"Jayden",
          @"Sandy"
      ];
      

      错误的结果:

      Aiden,
      Alexander,
      Benjamin,
      Daniel,
      David,
      Elijah,
      Ethan,
      Jackson,
      Jacob,
      James,
      Jayden,
      John,
      Liam,
      Logan,
      Lucas,
      Matthew,
      Oliver,
      Sandy,
      Mark,
      Mason,
      Michael,
      Noah,
      William
      

      你必须像这样扩展它:

      NSArray *markEndArray = [names sortedArrayUsingComparator:^NSComparisonResult(NSString *_Nonnull obj1, NSString *_Nonnull obj2) {
          if ([obj1 isEqualToString:@"Mark"]) {
              return NSOrderedDescending;
          } else if ([obj2 isEqualToString:@"Mark"]) {
              return NSOrderedAscending;
          } else {
              return [obj1 compare:obj2];
          }
      }];
      

      那应该没问题!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 1970-01-01
        相关资源
        最近更新 更多