我有一个数组,例如
Array {
3.0 at Index 0
2.0 at Index 1
3.5 at Index 2
1.0 at Index 4
}
我想按升序排序,而不会丢失索引,就像这样,
Array {
1.0 at Index 4
2.0 at Index 1
3.0 at Index 0
3.5 at Index 2
}
当我使用它对数组进行排序时,
NSArray *sortedArray = [hArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
[knnRecog sortUsingDescriptors:[NSArray arrayWithObject:sortAsc]];
我输了索引。有人知道排序数组后保留索引的方法吗?感谢
答案 0 :(得分:2)
您可以通过更改基础数据结构来进行所需的排序。考虑使用数组数组,例如:
{ {3.0, Index 0}, {2.0, Index 1}, {3.5, Index 2}, {1.0, Index 4} }
并给出了排序功能:
NSComparisonResult customCompareFunction(NSArray* first, NSArray* second, void* context)
{
id firstValue = [first objectAtIndex:0];
id secondValue = [second objectAtIndex:0];
return [firstValue compare:secondValue];
}
你可以这样排序:
NSArray* myArray = [NSArray arrayWithObjects:
[NSArray arrayWithObjects:
[NSNumber numberWithFloat:3.0f],
[NSNumber numberWithInt:0], nil],
[NSArray arrayWithObjects:
[NSNumber numberWithFloat:2.0f],
[NSNumber numberWithInt:1], nil],
[NSArray arrayWithObjects:
[NSNumber numberWithFloat:3.5f],
[NSNumber numberWithInt:2], nil],
[NSArray arrayWithObjects:
[NSNumber numberWithFloat:1.0f],
[NSNumber numberWithInt:4], nil]];
NSArray* sortedArray = [myArray sortedArrayUsingFunction:customCompareFunction context:NULL];
NSLog(@"Sorted array: %@", sortedArray);
打印哪些:
排序数组:( ( 1, 4 ) ( 2, 1 ) ( 3, 0 ) ( 3.5, 2 ) )
答案 1 :(得分:1)
根据定义,您无法对数组进行排序并保留初始索引,因为排序只是交换索引以生成新的排序顺序。排序总是改变索引。
听起来你真正想做的是将初始数组的索引转换为数据,然后将其与初始数组的数据一起存储。
如果是这样,那么你需要一组字典。字典应该将原始字典的单个索引与该索引处的值相关联:
NSDictionary *anElement=[NSDictionary dictionaryWithObject:[intialArray objectAtIndex:i] forKey:[NSNumber numberWithInt:i]];
然后将每个字典添加到数组以存储它们。然后,您可以根据需要对该数组进行排序(使用字典的谓词),而不会丢失原始数组中的关系。