Ios 使用自定义对象对NSMutableArray排序

Ios 使用自定义对象对NSMutableArray排序,ios,objective-c,sorting,nsmutablearray,Ios,Objective C,Sorting,Nsmutablearray,我有一个iOS应用程序,带有一个NSMutableArray,其中包含许多行的数据(分为3段)-如下所示: [PFUser object, stringData, floatValue] . . 4.3 . . 5.9 . . 1.1 . . 9.32 .

我有一个iOS应用程序,带有一个
NSMutableArray
,其中包含许多行的数据(分为3段)-如下所示:

[PFUser object, stringData, floatValue]
       .             .          4.3
       .             .          5.9
       .             .          1.1
       .             .          9.32
       .             .          0.024
上图显示了如何拆分阵列以及存储在阵列中的数据类型。但这些数据类型不是键或其他任何东西。所以我不能做像
valueForKey
这样的事情

阵列外观的示例如下:

@[@[userObject, @"hello", @234.1441],
  @[userObject, @"sdfsg", @94.33],
  @[userObject, @"wrfdo", @24.897]
];
从上面的例子可以看出,我在数组中有数组

我想通过读取包含浮点值的3段对数组进行排序

我该怎么做?我在网上看过很多关于使用
NSSortDescriptor
的书,但我遇到的问题是,所有的例子似乎总是使用简单的字符串或只包含数字的数组

有没有一种方法可以在具有自定义对象(如我的对象)的数组中使用
NSSortDescriptor

例如,在按浮点值对数组排序的情况下:

NSMutableArray *array = // Init your array;

array = [NSMutableArray arrayWithArray:[array sortedArrayUsingComparator:^(id obj1, id obj2) {
    float value1 = [[obj1 objectAtIndex:2] floatValue];
    float value2 = [[obj2 objectAtIndex:2] floatValue];

    if (value1 < value2) {
        return (NSComparisonResult)NSOrderedDescending;
    } else if (value1 > value2) {
        return (NSComparisonResult)NSOrderedAscending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }
}]];
NSMutableArray*array=//初始化数组;
array=[NSMutableArray arrayWithArray:[array sortedArrayUsingComparator:^(id obj1,id obj2){
浮点值1=[[obj1 objectAtIndex:2]浮点值];
浮点值2=[[obj2 objectAtIndex:2]浮点值];
如果(值1<值2){
返回(NSComparisonResult)或撤销;
}否则如果(值1>值2){
返回(NSComparisonResult)或删除;
}否则{
返回(NSComparisonResult)命令名;
}
}]];
使用此方法,您可以根据需要进行排序。

尝试以下方法:

例如,在按浮点值对数组排序的情况下:

NSMutableArray *array = // Init your array;

array = [NSMutableArray arrayWithArray:[array sortedArrayUsingComparator:^(id obj1, id obj2) {
    float value1 = [[obj1 objectAtIndex:2] floatValue];
    float value2 = [[obj2 objectAtIndex:2] floatValue];

    if (value1 < value2) {
        return (NSComparisonResult)NSOrderedDescending;
    } else if (value1 > value2) {
        return (NSComparisonResult)NSOrderedAscending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }
}]];
NSMutableArray*array=//初始化数组;
array=[NSMutableArray arrayWithArray:[array sortedArrayUsingComparator:^(id obj1,id obj2){
浮点值1=[[obj1 objectAtIndex:2]浮点值];
浮点值2=[[obj2 objectAtIndex:2]浮点值];
如果(值1<值2){
返回(NSComparisonResult)或撤销;
}否则如果(值1>值2){
返回(NSComparisonResult)或删除;
}否则{
返回(NSComparisonResult)命令名;
}
}]];

使用此方法,您可以根据需要进行排序。

NSMutableArray有一个调用sortUsingComparator,它将比较结果块作为参数。比如说:

[users sortUsingComparator:
     ^NSComparisonResult(id obj1, id obj2)
     {
         PFUser* userA = (PFUser*)obj1;
         PFUser* userB = (PFUser*)obj2;

        return [userA.floatValue compare:userB.floatValue];

     }];

NSMutableArray有一个调用sortUsingComparator,它将比较结果块作为参数。比如说:

[users sortUsingComparator:
     ^NSComparisonResult(id obj1, id obj2)
     {
         PFUser* userA = (PFUser*)obj1;
         PFUser* userB = (PFUser*)obj2;

        return [userA.floatValue compare:userB.floatValue];

     }];
你可以用

甚至(多亏了他的建议):

如果您有一个不可变数组,则可以使用

甚至(多亏了他的建议):



如果您有一个不可变的数组,那么可以使用

我确信这不能以干净的方式完成。因为你会一直违反排序不变量。创建一个自定义类来存储连接的数据。要清楚,您有一个数组数组,其中每个数组有3个值,对吗?您发布的示例在每个内部数组后都缺少逗号。@rmaddy是的,这是正确的。我确信这不能以干净的方式完成。因为你会一直违反排序不变量。创建一个自定义类来存储连接的数据。要清楚,您有一个数组数组,其中每个数组有3个值,对吗?您发布的示例在每个内部数组后都缺少逗号。@rmaddy是的,这是正确的。这不起作用。这不是一个
PFUser
对象数组。谁曾对此进行过投票,谁也不明白这个问题。这个答案行不通,行不通。这不是一个
PFUser
对象数组。谁曾对此进行过投票,谁也不明白这个问题。这个答案行不通。1)为什么要创建可变数组?2) 为什么要费心处理浮点值呢?只需从索引2中获取每个
NSNumber
,并直接比较这两个对象。不需要
if/else
。我的意思见Cristik的答案。它必须更简单。
sortUsingComparitor:
确实是这样,但是为什么不返回[obj1[2]compare:obj2[2]]?我创建了一个可变数组,因为SortedArray使用Comparator返回数组。这是一个浮点数的例子,代码必须调整。我添加了if/else来比较任何对象和任何对象,例如按字符串和浮点排序。你有电话号码。NSNumber非常清楚如何与另一个NSNumber进行比较。1)为什么要创建可变数组?2) 为什么要费心处理浮点值呢?只需从索引2中获取每个
NSNumber
,并直接比较这两个对象。不需要
if/else
。我的意思见Cristik的答案。它必须更简单。
sortUsingComparitor:
确实是这样,但是为什么不返回[obj1[2]compare:obj2[2]]?我创建了一个可变数组,因为SortedArray使用Comparator返回数组。这是一个浮点数的例子,代码必须调整。我添加了if/else来比较任何对象和任何对象,例如按字符串和浮点排序。你有电话号码。NSNumber非常清楚如何与另一个NSNumber进行比较。通过将
obj1
obj2
的类型从
id
更改为
NSArray*
,可以更轻松地进行比较。那么正文可以是一行。对于“如何排序…”的问题,正确的答案总是“使用sortUsingComparator并编写代码”或“不,你不能对字典排序”:-@gnaser729 true:))通过将
obj1
obj2
的类型更改为
NSArray*
id
更改为
。那么正文可以是一行。对于“如何排序…”的问题,正确答案总是“使用sortUsingComparator并编写代码”或“不,不能对字典排序”:-@gnasher729 true:)