Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 使用内部数组的最后一个元素对二维NSMutableArray进行排序_Sorting_Nsmutablearray - Fatal编程技术网

Sorting 使用内部数组的最后一个元素对二维NSMutableArray进行排序

Sorting 使用内部数组的最后一个元素对二维NSMutableArray进行排序,sorting,nsmutablearray,Sorting,Nsmutablearray,我有以下NSMutableArray: (A|B|C|D|E|255, F|G|H|I|J|122, K|L|M|N|O|555) 我尝试使用最后一个组件(255、122、555)对数组中的对象进行排序。现在我有以下代码: [myArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 正如预期的那样,此方法按第一个元素(A、F、K)对数组进行排序 我还了解了NSSortDescriptor,例如: N

我有以下NSMutableArray:

 (A|B|C|D|E|255,
 F|G|H|I|J|122,
 K|L|M|N|O|555)
我尝试使用最后一个组件(255、122、555)对数组中的对象进行排序。现在我有以下代码:

[myArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
正如预期的那样,此方法按第一个元素(A、F、K)对数组进行排序

我还了解了NSSortDescriptor,例如:

 NSSortDescriptor *sort = [[[NSSortDescriptor alloc] initWithKey:@"dateModified" ascending:YES] autorelease];

如果我使用它,不清楚我在
initWithKey

中作为参数输入了什么,我将使用sortUsingComparator:

[myArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [obj1.lastPropertyForComparison compare:obj2.lastPropertyForComparison];
}
此方法允许您手动比较要按其排序的对象的属性或成员。我几乎只在复杂的排序中使用它,我没有注意到任何性能差异

更新: 如果您的NSMutableArray包含NSArray,并且最后一个对象是您尝试按其排序的数字,那么您的比较器将如下所示:

[(NSNumber *)[obj1 lastObject] compare:(NSNumber *)[obj2 lastObject]]

基本上,您是从每个NSArray中抓取最后一个对象,您知道这是一个NSNumber。使用比较函数返回SensorDeredScending、SensorDeredScending或SensorDeredName。我希望这会有所帮助。

我会使用sortUsingComparator:

[myArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [obj1.lastPropertyForComparison compare:obj2.lastPropertyForComparison];
}
此方法允许您手动比较要按其排序的对象的属性或成员。我几乎只在复杂的排序中使用它,我没有注意到任何性能差异

更新: 如果您的NSMutableArray包含NSArray,并且最后一个对象是您尝试按其排序的数字,那么您的比较器将如下所示:

[(NSNumber *)[obj1 lastObject] compare:(NSNumber *)[obj2 lastObject]]

基本上,您是从每个NSArray中抓取最后一个对象,您知道这是一个NSNumber。使用比较函数返回SensorDeredScending、SensorDeredScending或SensorDeredName。我希望这会有所帮助。

我会使用sortUsingComparator:

[myArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [obj1.lastPropertyForComparison compare:obj2.lastPropertyForComparison];
}
此方法允许您手动比较要按其排序的对象的属性或成员。我几乎只在复杂的排序中使用它,我没有注意到任何性能差异

更新: 如果您的NSMutableArray包含NSArray,并且最后一个对象是您尝试按其排序的数字,那么您的比较器将如下所示:

[(NSNumber *)[obj1 lastObject] compare:(NSNumber *)[obj2 lastObject]]

基本上,您是从每个NSArray中抓取最后一个对象,您知道这是一个NSNumber。使用比较函数返回SensorDeredScending、SensorDeredScending或SensorDeredName。我希望这会有所帮助。

我会使用sortUsingComparator:

[myArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [obj1.lastPropertyForComparison compare:obj2.lastPropertyForComparison];
}
此方法允许您手动比较要按其排序的对象的属性或成员。我几乎只在复杂的排序中使用它,我没有注意到任何性能差异

更新: 如果您的NSMutableArray包含NSArray,并且最后一个对象是您尝试按其排序的数字,那么您的比较器将如下所示:

[(NSNumber *)[obj1 lastObject] compare:(NSNumber *)[obj2 lastObject]]

基本上,您是从每个NSArray中抓取最后一个对象,您知道这是一个NSNumber。使用比较函数返回SensorDeredScending、SensorDeredScending或SensorDeredName。我希望这会有所帮助。

您可以使用排序描述符,它获取“内部”数组的最后一个对象并按该对象排序

由于排序描述符使用键值编码(KVC),您需要知道数组以一种特殊的方式响应
valueForKey:
——它们将一个普通键传递给它们所包含的每个对象

您还需要知道,不接受参数并返回值的方法可以通过KVC is访问,如果它们是正常属性的话

所有这些加起来就是:

  • 数组中包含的每个对象(即内部数组)都有一个要排序的键:
    lastObject
  • 但是,由于对象是
    NSArray
    的实例,它们通常会将密钥传递给它们所包含的对象,这不是您想要的
  • 因此,对于这种情况,您需要在密钥名称中使用特殊的转义符,即
    @
    ,使实际密钥使用
    @lastObject
  • 因此,长话短说,你可以这样做:

    NSMutableArray *array = ... // Your array
    
    NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey: @"@lastObject"
                                                         ascending: YES 
                                                          selector: @selector(localizedCaseInsensitiveCompare:)];
    
    [array sortUsingDescriptors: @[sd]];
    
    您会注意到字符串中键名中的“@”


    此转义字符也适用于其他集合类,例如,如果要通过KVC从字典中访问
    allKeys
    ,则应使用
    @allKeys

    ,您可以使用排序描述符,它接受“内部”数组的最后一个对象并按该对象排序

    由于排序描述符使用键值编码(KVC),您需要知道数组以一种特殊的方式响应
    valueForKey:
    ——它们将一个普通键传递给它们所包含的每个对象

    您还需要知道,不接受参数并返回值的方法可以通过KVC is访问,如果它们是正常属性的话

    所有这些加起来就是:

  • 数组中包含的每个对象(即内部数组)都有一个要排序的键:
    lastObject
  • 但是,由于对象是
    NSArray
    的实例,它们通常会将密钥传递给它们所包含的对象,这不是您想要的
  • 因此,对于这种情况,您需要在密钥名称中使用特殊的转义符,即
    @
    ,使实际密钥使用
    @lastObject
  • 因此,长话短说,你可以这样做:

    NSMutableArray *array = ... // Your array
    
    NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey: @"@lastObject"
                                                         ascending: YES 
                                                          selector: @selector(localizedCaseInsensitiveCompare:)];
    
    [array sortUsingDescriptors: @[sd]];
    
    您会注意到字符串中键名中的“@”


    此转义字符也适用于其他集合类,例如,如果要通过KVC从字典中访问
    allKeys
    ,则应使用
    @allKeys

    ,您可以使用排序描述符,它接受“内部”数组的最后一个对象并按该对象排序

    由于排序描述符使用键值编码(KVC),您需要知道数组以一种特殊的方式响应
    valueForKey:
    ——它们将一个普通键传递给它们所包含的每个对象