繁体   English   中英

如何按2列/键对对象的NSArray进行排序

[英]How to sort an NSArray of objects by 2 column/key

我想根据其属性使用一个或多个对象条件对数组进行排序。

数组中的每个对象都包含一个对象,该对象又具有数组2或更多的NSString属性。

我们无法使用sortedArrayUsingDescriptors进行排序:因为要比较的字符串不是要排序的数组对象的属性。

说,

数组具有对象,这些对象具有两个属性,firstName和lastName。

我想按两个条件对数组进行排序,

1-按firstName对数组进行升/降排序2-然后当firstName相同时,按lastName对数组进行升/降排序。

到目前为止,我尝试了将插入排序按一个对象排序。 如果我希望按一种条件排序,效果很好。

看完后,我发现此问题按特定(NSString)字典键(例如sql查询)的Xcode排序数组

但它没有回答。

帮助将不胜感激。

使用sortedArrayUsingDescriptors:或可变数组副本)对数组进行排序,并为数组提供2个排序描述符(第一个用于名字,第二个用于姓氏)。

我琢磨了一会儿,得到了答案

这种自定义的书面方法

[self getStringforObject:obj2 forConditionInKey:condition.key];

将返回我要在对象中比较的字符串。

 NSArray *  allSortedObjects= [allobjects sortedArrayUsingComparator:^NSComparisonResult(id  obj1 , id obj2)
                          {
                            for (MYCondition *condition in [conditionArray allobjects] )
                              {

                                    if (condition.orderType==NSOrderedSame)
                                  {


                                      continue; // breaks when no sorting is needed
                                  }
                                  NSString * string1=[self getStringforObject:obj1 forConditionInKey:condition.key];
                                  NSString * string1=[self getStringforObject:obj2 forConditionInKey:condition.key];


                                  NSComparisonResult result=[string1 compare:string2 options:NSCaseInsensitiveSearch | NSNumericSearch];
                                  if (result == NSOrderedSame)
                                  {
                                      continue;
                                  }
                                else if(condition.orderType==NSOrderedDescending)
                                  {//when sorting needed is descending. 
                                      if (rexult==NSOrderedAscending)
                                      {
                                          return NSOrderedDescending;
                                      }
                                      else
                                      {
                                          return NSOrderedAscending;
                                      }

                                  }

                                  return result;
                              }

                              return NSOrderedSame;
                          }];

如果您想创建自己的算法,那么这种高级算法视图可以帮助您:-
步骤1:创建一个存储桶,将firstName作为值,并将lastnames作为List的特定值(意味着具有相同fistName的lastName将在同一列表中)

步骤2:按降序对(姓氏)列表进行排序

步骤3:按升序对firstName的存储桶进行排序

步骤4:重新创建数据库

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM