我正在对一个数组进行排序。 数组中有三种类型的元素。 1.精选 2.有机和 3. 声称。
其中,我只想对有机元素进行排序,并将特色元素和声明元素保留在它们自己的索引中。
下面是我的代码,其中我在字典中提取声明和特征索引,因为键是索引,值是数组元素。
//Initialization
NSMutableArray *sortedArray = nil;
NSMutableDictionary *tempFeaturedDictionary = [[NSMutableDictionary alloc]init];
NSMutableDictionary *tempClaimedDictionary = [[NSMutableDictionary alloc]init];
NSMutableArray *tempOrganicArray = [[NSMutableArray alloc]init];
for (int i = 0; i < array.count; i++) {
DRListing *isFeaturedObj = (DRListing*)[array objectAtIndex:i];
if (isFeaturedObj.featured) {
[tempFeaturedDictionary setObject:isFeaturedObj forKey:[@(i)stringValue]];
}else if (isFeaturedObj.claimed)
{
[tempClaimedDictionary setObject:isFeaturedObj forKey:[@(i)stringValue]];
}else
[tempOrganicArray addObject:isFeaturedObj];
}
在排序后,我再次将声明和特色添加回它们的原始索引:
sortedArray = [NSMutableArray arrayWithArray:[tempOrganicArray sortedArrayUsingDescriptors:sortDescriptorsArray]];
for (int i = 0; i<sortedArray.count; i++) {
for (NSString *key in tempFeaturedDictionary) {
if ( [[@(i)stringValue] isEqualToString: key] ) {
[sortedArray insertObject:[tempFeaturedDictionary objectForKey:[@(i)stringValue]] atIndex:i];
}}
for (NSString *key in tempClaimedDictionary) {
if ([[@(i)stringValue]isEqualToString:key ]) {
[sortedArray insertObject:[tempClaimedDictionary objectForKey:[@(i)stringValue]] atIndex:i];
}
}
}
代码运行良好。除了在“数组”的最后一个索引处有声明/(和)特色元素。因为在这种情况下,“sortedArray”索引仍然小于“array.count”。 提前致谢。
更新-
我收到类型的响应数组:
[{featured1 featured2}, {organic1, organic2..}, {claimed1}, {featured11, featured12}, {organic11, organic12..}, {claimed2}, ..]
而且我只能对该数组中的有机元素进行排序。精选和声明不应失去其原始索引位置。
最佳答案
我会遍历数组,提取有机物进行排序。然后对您的有机阵列进行排序。然后迭代原始数组,适本地获取原始数组中的元素或排序后的有机物数组中的元素。
NSMutableArray *organicsArray = [NSMutableArray new];
for (int i = 0; i < array.count; i++) {
DRListing *isFeaturedObj = (DRListing*)array[i];
if ((!isFeaturedObj.featured) && (!isFeaturedObj.claimed)) {
[organicsArray addObject:isFeaturedObj];
}
}
NSMutableArray *sortedOrganicsArray = [[organicsArray sortedArrayUsingDescriptors:sortDescriptorsArray] mutableCopy];
NSMutableArray *outputArray = [NSMutableArray new];
for (int i = 0; i < array.count; i++) {
DRListing *isFeaturedObj = (DRListing*)array[i];
if ((!isFeaturedObj.featured) && (!isFeaturedObj.claimed)) {
[outputArray addObject:sortedOrganicsArray[0]];
[sortedOrganicsArray removeObjectAtIndex:0];
} else {
[outputArray addObject:isFeaturedObject];
}
}
如果你颠倒有机物数组的排序顺序,你可能会提高它的效率,因为那时你可以说
[outputArray addObject:[sortedOrganicsArray lastObject]];
[sortedOrganicsArray removeLastObject];
但是如果您的数组不是特别大,那么性能改进可能可以忽略不计。
关于ios - 删除数组元素并将它们添加到同一索引 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37207407/