【问题标题】:Sorting an NSArray keeping original indexes rather than values对保持原始索引而不是值的 NSArray 进行排序
【发布时间】:2015-09-25 00:03:40
【问题描述】:

我有一个值数组,我想将它从最高值到最低值排序。这是我的数组:

@[@0.985517248005697843460382, @0.000103821940243745174581, @0.002930049254083499140483, @0.006089428685598983863325, @0.000169959081717878927225   @0.038708805305937427077012, @0.005785644142951103588435, @0.003949420720490224266663   @0.003306789895982742942537, @0.005520713777168946394258];

什么是创建新数组最有效的方法,但它不包含排序值,而是包含原始数组的索引?

目前这是我正在做的:

NSArray *array = @[@3, @5, @7, @2, @4, @4.1, @1, @10];
NSArray *sortedArray = [array sortedArrayUsingSelector: @selector(compare:)];
NSMutableArray *arraySortedByOriginalIndexes = [[NSMutableArray alloc] init];
for (int i = 0; i < sortedArray.count; i++) {
    NSUInteger index = [array indexOfObject:sortedArray[i]];
    [arraySortedByOriginalIndexes addObject:@(index)];
}

【问题讨论】:

  • 他们是NSNumbers,类型为double。我将在 2 分钟内发布一个示例。

标签: ios objective-c cocoa-touch sorting nsarray


【解决方案1】:

如果数组中没有数字相等,这是简单的解决方案。

NSArray *sortedArray = [array sortedArrayUsingSelector: @selector(compare:)];

NSMutableArray *mutableIndexes = [NSMutableArray array];
for (NSNumber *number in sortedArray) {
    [mutableIndexes addObject:@([array indexOfObject:number])];
}
NSArray *indexes = [mutableIndexes copy];

同样,它仅在没有数字相等时才有效。

【讨论】:

  • 谢谢杰弗里!在保证订单方面可以信任快速枚举吗?如果 2 个数字相等,它会返回找到的第一个数字吗?
  • [mutableIndexes copy] 的意义何在?你真的想要[NSArray arrayWithArray:mutableIndexes]吗?
  • @KingPolygon 可以用于数组
  • @KingPolygon 快速枚举总是按顺序遍历数组。
  • @Paulw11 询问我宣布@property (nonatomic, copy) NSMutableArray *items 的时间。崩溃非常令人困惑。
猜你喜欢
  • 2021-04-15
  • 2017-07-12
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多