Ios 使用自定义对象对NSMutableArray排序
我有一个iOS应用程序,带有一个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 .
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:)