如何按 2 column/key 对对象的 NSArray 进行排序

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

我想使用一个或多个基于 属性 的对象条件对数组进行排序。

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

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

说,

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

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

1- 按名字排序 ascending/descending 数组 2- 然后当 firstName 相同时再次按 lastName 对数组 ascending/descending 排序。

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

看了之后发现了这个问题 Xcode sort array by specific (NSString) dictionary key (like sql query)

但无人接听

我们将不胜感激。

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

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

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

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

第 4 步:重新创建数据库

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

这个自定义写法

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

请问return对象中我要比较的字符串

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