【问题标题】:sort NSMutableArray objects排序 NSMutableArray 对象
【发布时间】:2013-10-05 07:25:00
【问题描述】:

我有一个 person 对象,它具有 NSString 属性 firstname、lastname、birthday 和 NSMutableDictionary 的不同电话号码。

我必须在数组中添加不同的人对象,并按年龄对这些对象进行排序, 我有计算他们年龄的方法,但不确定如何将计算出的年龄与现有的所有人对象数组联系起来并对其进行排序。

请帮忙。

【问题讨论】:

  • 你知道,如果你按出生日期排序,你就按年龄排序。 (除非有些人计算狗年,或者杰克本尼是名单中的人之一。)
  • 在一个不相关的注释中,实例变量应该用于保存 state,并且它们的名称应该反映这一点。所以我不会使用动词(以及祈使形式)作为addPersonArray 变量名的第一部分。例如,您可以将其称为 personArray,名称将反映变量所包含的内容。
  • @Monola 非常感谢您的更正,我会这样做的
  • @HotLicks,生日对象是NSString,我不能直接用它来排序数组
  • 你当然可以使用它,与 sortedArrayUsingFunction/Selector/Comparator 一起使用。

标签: objective-c


【解决方案1】:

我理解正确吗?您想按人的年龄对数组进行排序吗?

使用 NSArray 的-sortedArrayUsingComparator: 方法可以很容易地进行排序。假设一个人有一个名为 age 的属性,其类型为 NSInteger。我们可以像这样对数组进行排序:

// lets assume _persons_ is an array of Person objects ...
NSArray *sortedPersons = [persons sortedArrayUsingComparator: ^(Person *p1, Person *p2) {
   if (p1.age > p2.age) {
      return NSOrderedDescending;
   }

   if (p1.age < p2.age) {
       return NSOrderedAscending;
   }

   return NSOrderedSame;
}];

当然,您可以在比较器中进行任何类型的比较。例如。您可以比较日期、字符串等...您返回的 NSComparisonResult 会将数组中的项目移动到正确的位置。

编辑

以下方法可能适用于您的特定情况:

NSArray *sortedPersons = [persons sortedArrayUsingComparator: ^(Person *p1, Person *p2) {
   NSDate *date1 = [p1.birthday asDate];
   NSDate *date2 = [p2.birthday asDate];
   return [date1 compare:date2];
}];

【讨论】:

  • 是的,我必须按人的年龄对数组进行排序,但我没有人的年龄对象,我可以使用人的生日来计算年龄,但是我该如何使用它计算年龄以对数组进行排序。
  • 您也可以按日期排序,只需更改比较器即可。见:stackoverflow.com/a/5965106/250164
  • @czechboy 从他在 op 中的代码来看,它似乎是一个 NSString 对象。
  • 我按照他在 openingspost 中解析的日期改了。
  • @WolfgangSchreurs 所以这个编辑给了我 NSDate 的生日,所以当你说 return [date1 compare:date2] 会发生什么时,我正处于学习阶段,请多多包涵。另外,如果我在 personArry 中有超过 2 个对象怎么办?
【解决方案2】:

如果要按特定的property(如age)排序,请使用NSSortDesriptor

NSArray * people  = ... //your array of Person objects
NSSortDescriptor * sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
NSArray * sortedPeopleByAge = [people sortedArrayUsingDescriptors:@[sortDescriptor];
//sortedPeopleByAge are ... you know ... people sorted by age.

希望这就是你的意思。

【讨论】:

  • age 不存在。他有一个birthday,它是一个字符串。
【解决方案3】:
NSDateFormatter df = [NSDateFormatter new];

persons = [persons sortedArrayUsingComparator: ^(Person *p1, Person *p2) {
   NSDate* d1 = [df dateFromString:p1.birthday];
   NSDate* d2 = [df dateFromString:p2.birthday];

   return [d1 compare:d2];
}];

【讨论】:

  • 当然,日期格式化程序需要适当地设置它的格式。另外,OP 显然已经在 NSString 上有一个“asDate”类别,它返回一个 NSDate,所以显式日期格式化程序是不必要的。
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多